Programim dhe zhvillim, javascript, python, php, html

për ciklin ekzekutohet dy herë në C

Unë jam i ri në programimin C. Dhe unë po bëja një praktikë, dhe pyetja shkon kështu: Përdorni operatorin ?: dhe deklaratën for për të shkruar një program që vazhdon të marrë karakteret e futura nga përdoruesi derisa të llogaritet karakteri q.

Dhe këtu është programi që kam shkruar:

#include <stdio.h>

main()
{
    int x, i=0;
    for (x = 0; x == 'q'? 0 : 1; printf("Loop %d is finished\n",i))
    {
        printf("Enter q to exit!!!\n");
        printf("Please enter a character:\n");
        x=getc(stdin);
        putc(x,stdout);
        ++i;
    }
    printf("\nThe for loop is ended. Bye!");

    return 0;       
}

Problemi është: sa herë që fut një karakter "jo-q", cikli duket se funksionon dy herë. Nuk e di se çfarë nuk shkon me programin tim. Ju lutem ndihmë!

c
20.04.2014

  • duket sikur duhet të pastroni buferin e hyrjes, sepse mendoj se po lexoni në një rresht të ri. 20.04.2014

Përgjigjet:


1

Cikli funksionon dy herë sepse kur futni një karakter jo-q, në fakt futni dy karaktere - karakterin jo-q dhe karakterin e linjës së re '\n'. x = getc(stdin); lexon karakterin jo-q nga transmetimi stdin por linja e re është ende e shtrirë në buferin e stdin që lexohet në thirrjen tjetër getc.

Duhet të përdorni fgets për të lexuar një rresht nga transmetimi siç kanë sugjeruar të tjerët dhe më pas mund ta përpunoni rreshtin. Gjithashtu, duhet të specifikoni llojin e kthimit të main si int. Unë sugjeroj ndryshimet e mëposhtme -

#include <stdio.h>

int main(void)
{
    int x, i = 0;

    // array to store the input line
    // assuming that the max length of
    // the line is 10. +1 is for the 
    // terminating null added by fscanf to
    // mark the end of the string
    char line[10 + 1];

    for (x = 0; x == 'q'? 0 : 1; printf("Loop %d is finished\n", i))
    {
        printf("Enter q to exit!!!\n");
        printf("Please enter a character:\n");

        // fgets reads an input line of at most 
        // one less than sizeof line, i.e., 
        // 10 characters from stdin and saves it 
        // in the array line and then adds a 
        // terminating null byte
        fgets(line, sizeof line, stdin);

        // assign the first character of line to x
        x = line[0];
        putc(x, stdout);
        ++i;
    }
    printf("\nThe for loop is ended. Bye!");

    return 0;       
}
20.04.2014

2

Kur futni një shkronjë jo-q, shtypni gjithashtu Enter, e cila lexohet në ciklin e dytë.

Për ta bërë ciklin të ekzekutohet vetëm një herë për hyrje, përdorni fgets() për të lexuar një rresht të tërë të hyrjes menjëherë dhe kontrolloni nëse vargu i hyrjes përputhet me pritshmëritë tuaja.

20.04.2014
  • Pra, si mund të arrini të ekzekutoni vetëm një herë? 20.04.2014
  • Me fjalë të tjera, ka dy karaktere për t'i lexuar getc(stdin);, dhe kjo e bën punën e saj! 20.04.2014
  • Lexoni të gjithë rreshtin me fgets. 20.04.2014
  • Ju mund të dëshironi të lexoni për sigurinë me scanf dhe fgets. 20.04.2014
  • Përndryshe, shikoni nëse getc mori \n dhe bëni një tjetër getc në atë rast. Dhe trajtoni EOF. 20.04.2014

  • 3

    Kur shkruani a dhe më pas shtypni Enter, karakteri i linjës së re bëhet pjesë e transmetimit stdin. Pasi të lexohet a, herën tjetër që të ekzekutoni x=getc(stdin), vlera e x vendoset në \n. Kjo është arsyeja pse dy përsëritje të ciklit ekzekutohen.

    20.04.2014

    4

    Kur futni një karakter, thoni 'x' dhe shtypni enter, në fakt futni dy karaktere, të cilat janë 'x' dhe '\n' të njohura gjithashtu si linjë e re (kur shtypni enter). '\n' bëhet pjesë e rrjedhës hyrëse dhe cikli ekzekutohet gjithashtu për të.

    Gjithashtu, provoni të futni "xyz" dhe shtypni enter, cikli do të ekzekutohet 4 herë. Për çdo 'x', 'y', 'z' dhe '\n'.

    Nëse dëshironi që kodi të funksionojë një herë për çdo hyrje, përdorni funksionin merr.

    #include <stdio.h>
    
    main()
    {
        int i=0;
        char x[10];
        for ( ; x[0]!='q'; printf("Loop %d is finished\n",i) )
        {
            printf("Enter q to exit!!!\n");
            printf("Please enter a character:\n");
            gets(x);
            i++;
        }
        printf("\nThe for loop is ended. Bye!");
    
        return 0;
    }
    

    Në këtë kod ne deklaruam x si varg, funksioni gets() lexon të gjithë rreshtin që kemi futur, pastaj në pjesën e kushtit të ciklit for, kontrollojmë nëse karakteri i parë i vargut është 'q' apo jo.

    20.04.2014
    Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..