nieco ako readLine (jazyk C)

Programovacie jazyky, rady, poradňa...
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

nieco ako readLine (jazyk C)

Príspevok od používateľa mirak2 »

uz tri dni sa seriem s tym ako nacitat cely riadok v C (zadanie celej vseobecnej vety aj s medzerami, oddelene \n)...na googli som nasiel vela rieseni, ale ziadne som nepochopil a tie co som pochopil mi nefungovali...
jeden kamarat mi poslal fintu co robili v skole, je celkom sikovna

Kód: Vybrať všetko

for (i = 0; (i < 100) && ((c = getchar()) != '\n'); i++)
    {
        riadok[i] = c;
    }
problem je v tom, ze ja predtym mam hromadu vypisaneho textu, viacero scanf a tym padom to nefunguje, lebo to nacitava z minuleho riadku alebo ine hovadiny to robi...v C nie som nijak extra zbehly, som JAVAista a podla toho aj moja praca vyzera, preto poprosim ak niekto ma nieco funkcne tak nech mi to po lopate vysvetli
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: nieco ako readLine (jazyk C)

Príspevok od používateľa audiotrack »

Kód: Vybrať všetko

#include <stdio.h>

int main()
{
  char string [256];
  printf("zadaj retazec: ");
  gets(string);  
  printf("napisal si: %s\n",string);
  return 0;
}
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: nieco ako readLine (jazyk C)

Príspevok od používateľa mirak2 »

som cital ze gets robi problemy, tak neviem, vyskusam
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: nieco ako readLine (jazyk C)

Príspevok od používateľa BX »

C-čko niekedy môže robiť haluze s načítavaním. Niekedy pred tým treba vyčistiť zásobník, nech tam nie je znak '\n' a to napríklad takto:

Kód: Vybrať všetko

while (cin.peek() != '\n' ) cin.ignore(1);
    cin.ignore(1);
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: nieco ako readLine (jazyk C)

Príspevok od používateľa mirak2 »

a ten cin chce byt co? :lol: sry ze sa tak blbo pytam ale nie je mi jasne z nazvu ani z kontextu
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: nieco ako readLine (jazyk C)

Príspevok od používateľa BX »

Jój kurnik, prepáč :lol: Ja používam toto a vôbec som si neuvedomil, že to je C++ :oops:
V C by mal teda fungovať príkaz fflush(stdin);
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: nieco ako readLine (jazyk C)

Príspevok od používateľa mirak2 »

stale mi to robi to iste...skusam to aj mimo svojho programu, len v cistom maine, robi to stale uplne to iste...scanf robi totalne hovadiny
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: nieco ako readLine (jazyk C)

Príspevok od používateľa BX »

To audiove je dobre a v spolupráci s fflush nevidím problém, takže: Ukáž kód :P
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: nieco ako readLine (jazyk C)

Príspevok od používateľa manager666 »

Ja len podotknem, ze pre nacitavanie retazcov je lepsie pouzivat funkciu fgets, ktora ma argument aj na obmedzenie dlzky retazca, aby sa neprepisovalo miesto v pamati.
prototyp: char *fgets(char *str, int n, FILE *stream);
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: nieco ako readLine (jazyk C)

Príspevok od používateľa mirak2 »

mam vytvorit malu databazu cdciek s "uzivatelskym prostredim", cez structy mam porobene vsetky potrebne struktury, a toto je funkcia na upravu skladby v databaze (v databaze su ulozene albumy (sme robili v skole akoze arraylist, tak to som vyuzil), albumy obsahuju interpreta, cenu a vydavatela a zoznam skladieb, zoznam skladieb znova ako arraylist obsahuje pesnicky, kazda pesnicka obsahuje nazov a casovy udaj lktory pozostava z minut a sekund)...
na zaciatku je vyber albumu, potom vyber skladby, to by malo byt ok...a potom ide to co robi sarapatu kadejaku..vacsinou to preskoci uplne, rovno caka scanf na udaje pre cas

je to prakticky moj prvy C program takze tak... :lol:

Kód: Vybrať všetko

int editing_skladba(DATABAZA list) {
    if(list==NULL) return -1;
    printf("Vyber album zadanim poradoveho cisla (zadaj 0 pre navrat do hlavneho menu):\n");
    int i;
    for(i=0;i<list->size;i++) {
        printf("%d. ",i+1);
        album_tostring_light(&list->storage[i]);
    }
    int in_album;
    scanf("%d",&in_album);
    if(in_album==0) return -1;
    in_album--;

    printf("Vyber skladbu zadanim poradoveho cisla (zadaj 0 pre navrat do hlavneho menu):\n");
    tracklist_tostring((&list->storage[in_album])->trackList);
    int in_skladba;
    scanf("%d",&in_skladba);
    if(in_skladba==0) return -1;
    in_skladba--;

    printf("Zadaj novy nazov skladby: (%s)\n",(&(&list->storage[in_album])->trackList->storage[in_skladba])->nazov);
    char newnazov[100];
    char c;
    for (i = 0; (i < 100) && ((c = getchar()) != '\n'); i++)
    {
        newnazov[i] = c;
    }
    
    //gets(newnazov);
    printf("Toto ste zadali: %s\n",newnazov);

    printf("Zadaj novu dlzku skladby (zadajte minutovy udaj, medzeru, sekundovy udaj - priklad 3 13):\n");
    int minuty;
    int sekundy;
    scanf("%d %d",&minuty,&sekundy);
    CAS newdlzka = new_cas(minuty,sekundy);
    
    edit_skladba((&(&list->storage[in_album])->trackList->storage[in_skladba]),newnazov,newdlzka);
    free(newdlzka);
    return 0;
}
tomPD
Star
Star
Používateľov profilový obrázok
Príspevky: 679
Registrovaný: 17 okt 2005, 14:41
Bydlisko: Senec
Kontaktovať používateľa:

Re: nieco ako readLine (jazyk C)

Príspevok od používateľa tomPD »

Pouzi tam fgets ako spominal manager666 vyssie, alebo to mozes nacitat aj pomocou scnaf.
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: nieco ako readLine (jazyk C)

Príspevok od používateľa manager666 »

Okay, mal by si to upravit takto:

Kód: Vybrať všetko

fflush(stdin);
printf("Zadaj novy nazov skladby: (%s)\n",(&(&list->storage[in_album])->trackList->storage[in_skladba])->nazov);
char newnazov[100];
fgets(newnazov,100,stdin);
fflush(stdin);
Jednoducho vsade tam, kde ti zostavaju na vstupe zbytocne znaky, tak pouzijes fflush(stdin), ktory vymaze obsah klasickeho vstupu. Este, ked som nepoznal fflush, tak som na toto pouzival getchar()/*zvycajne po nacitavani scanfom*/, alebo gets(nejaky_retazec)/*v ostatnych pripadoch*/

:wink:
Napísať odpoveď