windows - Hvordan laver jeg denne simple C-program genstart med kun en tast-tryk i stedet for to

Indlæg af Hanne Mølgaard Plasc

Problem



Dette er et selvhjælpsprogram, jeg lavede til nyttige pauseaktiviteter. I slutningen af ​​det skal du indtaste et nummer, og tryk derefter på 'Enter' for at genstarte. Jeg skal hellere kun skrive noget eller et hvilket som helst nummer.


#include <stdio.h>
#include <stdlib.h>

main()
{
  int i;

  srand((unsigned)time(NULL));

  i = rand();

  int k;
  k = (int)i\%22;
  printf("

");

   switch(k){


            case 0: printf("\%	 Weather"); printf(" weather"); break;                        
            case 1: printf("	 Hand exercises ok"); break;

            case 2: printf("	 BR break"); break;

            // etc etc            
            case 15: printf("	 ~~ DOODLE ON PAPER ## "); break;
            case 16: printf("	 Practice Mental Math "); break;
            case 17: printf(" 	go to SNOPES.com	"); break;

            case 18: printf("	 Browse JAVA API"); break;
            case 19: printf("	 Left handed writing"); break;
            case 20: printf("	Go outside OUTSIDE	"); break;
            case 21: printf("	Call M&K	"); break;
            case 22: printf("TRASH CAN BBALL	"); break;


            }

            printf("




















");

        long g;

        scanf("\%d", &g);

        if(g >0){
                 system("cls");
                 main();
                 }


     system("pause");
}


Jeg bruger dette som en simpel Windows App. Hvis der er andre problemer/problemer, er jeg helt åben for kritik, som jeg er stadig ny til C. Jeg sætter pris på nogle tips eller råd.

Bedste reference


Hvis du har adgang til biblioteket conio, kan du bruge kbhit() til at fange en tastetryk: [9]


#include <conio.h>

int main(void) {
  while (1) {
    /* ... */

    if(kbhit())
    {
       break;
    }
  }
}

Andre referencer 1


main er en funktion som enhver anden. Der er ikke noget særligt med det, undtagen C Runtime s startup funktion (normalt kaldet 'start ()' opsætter parametre og kalder det. Gå nødder.


Især i dit tilfælde hvor du ikke var interesseret i argc/argv.


Anyways - dit virkelige problem er, at stdin er line orienteret som standard - så enhver getc/getchar/scanf bliver bufferet indtil en vognretur. Der er forskellige måder at fortryde dette baseret på OS.


setvbuf () og venner kan ændre buffering, men det fungerer muligvis ikke afhængigt af dit operativsystem, fordi de underliggende filhåndtag af systemet muligvis forbliver bufferet.


Nogle OS'er har andre funktioner som kbhit (); (ikke ansi) eller lignende. Undskyld det er ikke et solidt svar - hvad er dit operativsystem?

Andre referencer 2


For det første skal du ikke ringe main til noget tidspunkt i din kode. Hvis du vil genstart , skal du blot kode en loop, der fortsætter til opsigelsesbetingelsen. huske om rekursivt at kalde main er gyldig i henhold til standarden, men selvom det var risikerer du at gå i stykker på grund af ukontrolleret rekursion.


Hvis du vil tillade tom indtastning (bare ENTER-tasten) for at afslutte input, kan du bruge fgets for at få en linje (tom eller ej) og derefter vurdere det.


Jeg peger altid på folk til min robuste brugerindgangsfunktion, og hvis du bruger det, kan du simpelthen kode noget som:


// Force initial entry into loop
int rc = RC\_NO\_INPUT;
char buff[] = {`x', '`};
:
// Run loop until empty input.
while ((rc == OK) && (*buff != '')) {
    // Do whatever you need to do here.

    // Get input, 'while' loop will check it.
    rc = getLine ("ENTER to exit, anything else to continue: ",
        buff, sizeof (buff));
}