IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Problem s viacnasobny scanf, gets

Aktivity
Avatar
rplsicik
Člen
Avatar
rplsicik:17.1.2015 13:00

Zdravím
V poslednej dobe som nejaký nadmerne plodný na otázky za čo sa ospravedlňujem.
Chcel by som sa spytať na jednu ved s ktorou už mam dlhšie problémy.
Ked píšem kód ktorý obsahuje viacej scanf za sebou často sa mi stava že tie predchádzajúce preskočí a začne čakat až pri poslednom scanf. (To iste aj ked načítavam neformatovanu hodnotu zo vstupu za pomoci gets)
Najväčšia sranda je vtom že tento problém nevzniká vždy, predpokladám že chyba je na mojej strane a daný problém sa da nejako ošetrit. :)

 
Odpovědět
17.1.2015 13:00
Avatar
expoox
Tvůrce
Avatar
Odpovídá na rplsicik
expoox:17.1.2015 13:03

Ahoj, vies uviest priklad kodu, kde ti to robi ?

 
Nahoru Odpovědět
17.1.2015 13:03
Avatar
rplsicik
Člen
Avatar
rplsicik:17.1.2015 15:09
int registracia()                                                               //Funkcia na ukladanie novych uzivatelov
{
        int dlzka=40;

        char * meno=alokujstring(dlzka);
        char * heslo=alokujstring(dlzka);

        FILE *zapis;

                printf("                Vyplnte udaje\n\n");
                zapis=fopen("Udaje.txt","at");

                printf("\tMeno: ");
                gets (meno);
                fprintf(zapis,"\n%s\n",meno);           // fprintf(zapis); zapisuje do suboru  Udaje.txt
                printf("\tHeslo: ");
                gets(heslo);
        fprintf(zapis,"%s\n",heslo);

                fclose(zapis);

    //Uvolnenie pamate
        free(meno);
    free(heslo);
    return 0;
}

Je tam ešte volana funkcia na alokovanie stringu ale vtom nieje problem.

Editováno 17.1.2015 15:11
 
Nahoru Odpovědět
17.1.2015 15:09
Avatar
expoox
Tvůrce
Avatar
Odpovídá na rplsicik
expoox:18.1.2015 0:45

no mne to fuguje v pohode, kedze nemam tu tvoju funkciu na alokaciu tak raz som skusil staticke pole s velkostou 50 a raz (char*)malloc(50 * sizeof(char)) a v oboch pripadoch to cakalo na oba vstupy

Editováno 18.1.2015 0:46
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
18.1.2015 0:45
Avatar
rplsicik
Člen
Avatar
Odpovídá na expoox
rplsicik:18.1.2015 0:51

Vdaka za to že si to prešiel somnou a skusil. Proste vyzera to možno na chybu v kompilatore? Neviem netušim som ešte amater.
No viem že som ten kod hodil do NetBeans a tam bežal, potom po reštarte pc kod bežal už aj v Code::Blocku a potom zasa nie.
Dufam že mi to nespravi pri obhajobe semestralky :) Inak aj tak velmi dakujem za pomoc som rad že som to mal skym prediskutovat.

 
Nahoru Odpovědět
18.1.2015 0:51
Avatar
rplsicik
Člen
Avatar
rplsicik:18.1.2015 2:09

Ešte by som len doplnil rad by som počul nazor, či taketo ošetrenie aby mi nahodou znova nepreskočilo vstup je vhodne alebo som sa dopustil uplneho "fópa"

int registracia()                                                               //Funkcia na ukladanie novych uzivatelov
{
        int dlzka=40;

        char * meno=alokujstring(dlzka);
        char * heslo=alokujstring(dlzka);

        FILE *zapis;

                printf("\t\t\tVyplnte udaje\n\n");
                zapis=fopen("Udaje.txt","at");

                printf("\tMeno: ");
                while ((gets(meno)) != NULL) ///Cyklus je tu uvedeny preto lebo program necakal na nacitanie mena hned siel na heslo
        {                              //Ak premenna meno nenacita hodnotu bude sa opakovat do momentu pokial ju nacita
            gets (meno);               //Tymto sposobom som predchadzal preskočeniu funkcie gets (meno) priamo na gets(heslo)
            break;
        }
                fprintf(zapis,"\n%s\n",meno);           // fprintf(zapis); zapisuje do suboru  Udaje.txt
                printf("\tHeslo: ");
                gets(heslo);
        fprintf(zapis,"%s\n",heslo);

                fclose(zapis);

    //Uvolnenie pamate
        free(meno);
    free(heslo);
    return 0;
}

A ešte kedže som hore neuviedol funkciu na alokovanie pamate tak tu je:

char * alokujstring(int DlzkaRetazca)           //Funkcia na alokaciu retazca, stringu
{
        char * lokretazec = (char*) malloc (sizeof(char)*(DlzkaRetazca+1));
        if(lokretazec == NULL)  // null je pointer ktori ukazuej nikam
    {
        printf("retazec sa nepodarilo alokavat");
        return NULL;
    }
        return lokretazec;
}
 
Nahoru Odpovědět
18.1.2015 2:09
Avatar
expoox
Tvůrce
Avatar
Odpovídá na rplsicik
expoox:18.1.2015 11:47

ja tiez nie som neaky extra skuseny programator, som v prvom rocniku na vyske, takze to co ti teraz poviem neber ako pismo svate... nevidim vobec ziadny dovod preco by to malo vynechat gets(meno), takze to bude pravdepodobne nieco iba s kompilatorom, tvoj kod som odskusal na 3 roznych pocitacoch a vsade fungoval, + ten while sa mi velmi nepozdava, neviem ci gets vracia NULL pri niecom ale ak ano tak ta podmienka by mala vyzerat skor takto :

int v;
v=gets(meno);
while (v == NULL)
     v=gets(meno);

ale opat hovorim, neviem ci gets vracia neaku hodnotu

 
Nahoru Odpovědět
18.1.2015 11:47
Avatar
rplsicik
Člen
Avatar
Odpovídá na expoox
rplsicik:19.1.2015 21:15

Tak to sme na tom rovnako čo sa študia na výške týka. Problem s nenačitanim premennej ani riešit nebude proste raz to spravi a raz nie a tie rizikove vstupy si preistotu ošetrujem cyklom. Hlavne že je semestralna praca uspešne odovzdana a obhajena :)
Dakujem za asistenciu.

 
Nahoru Odpovědět
19.1.2015 21:15
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.