2

私は、私の考えでは、非常に単純なタスクで立ち往生してしまいました。乱数を選択し、それがどれであるかを推測させ、文字「n」または「N」が入力された場合に最後にプログラムを終了させるプログラムを作成しました。コードは次のとおりです。

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

int input_switcher(int input, int answer)
{
    if (input == answer)    {return 1;} 
    else if(input < answer) {return 2;}
    else if(input > answer) {return 3;}
    else                    {return 0;}
}

int main(void)
{
    int input, answer, tries;
    char keepGoing = 'J';
    srand((int)time(0));

    while(42)
    {
        input = 0, tries = 0;
        answer = 1;//rand()%100+1;

        printf("Jag \"t\x84nker\" p\x86 ett tal mellan 1 och 100, gissa vilket!\n");

            while(42)
            {
                printf("Gissning: ");
                scanf_s("%d", &input);

                switch (input_switcher(input, answer))
                {
                case 1:
                    printf("Grattis, det var r\x84tt!\n");
                    printf("Du gjorde %d f\x94rs\x94k.", tries);
                    break;
                case 2:
                    printf("Du gissade f\x94r l\x86gt, f\x94rs\x94k igen!\n");
                    tries++;
                    break;
                case 3:
                    printf("Du gissade f\x94r h\x94gt, f\x94rs\x94k igen!\n");
                    tries++;
                    break;
                default:
                break;
                }
                if(input == answer)     {break;}
            }
        printf("Ska vi spela en g\x86ng till(J/N)? ");
        scanf_s("%*c%c", &keepGoing);
        if(keepGoing == 'N' || keepGoing == 'n')        {return 0;}
        else if(keepGoing == 'J' || keepGoing == 'j')   {system("cls");}
    }   
    return 0;
}

私が抱えている問題は、入力した文字の代わりに最後scanf_s\0文字が表示されることです。問題を特定しましたか、それとも間違っていますか? この問題を解決するために何を変更できますか?

4

2 に答える 2

5

あなたの最後のscanf_s受信は\nありません\0。この\n変化 を食い尽くすために

printf("Ska vi spela en g\x86ng till(J/N)? ");
scanf_s("%*c%c", &keepGoing);

 printf("Ska vi spela en g\x86ng till(J/N)? ");
 scanf_s(" %c", &keepGoing);
          ^
          |
   space before %c specifier

それは働いています。
出力: GCC 4.7.1 を使用する Win7 で

ここに画像の説明を入力

于 2013-09-16T19:21:15.580 に答える
1

scanf()scanf_s==> の代わりにこれで十分です

scanf2か所で 変更できます

このような:

scanf("%d", &input);  
scanf(" %c", &keepGoing); 
         ^  //use space here , to consume the leftover \n from previous scanf entry

それでも問題が発生する場合はfflush(stdin);、前回の前に使用できますscanf_s() Windowsではこれが機能します。

             fflush(stdin);  
             scanf("%c", &keepGoing);
于 2013-09-16T19:23:24.030 に答える