11

私はCにかなり慣れていないので、プログラムへのデータ入力に問題があります。

私のコード:

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

int main(void) {
   int a;
   char b[20];

   printf("Input your ID: ");
   scanf("%d", &a);

   printf("Input your name: ");
   gets(b);   

   printf("---------");

   printf("Name: %s", b);   

   system("pause");
   return 0;
}

IDを入力できますが、残りの入力はスキップされます。このように順序を変更した場合:

printf("Input your name: ");
   gets(b);   

   printf("Input your ID: ");
   scanf("%d", &a);

それが動作します。ただし、順序を変更することはできず、そのまま必要です。誰かが私を助けることができますか?多分私は他のいくつかの機能を使う必要があります。ありがとう!

4

8 に答える 8

12

試す:

scanf("%d\n", &a);

取得は、scanfが残す'\ n'のみを読み取ります。また、取得ではなくfgetsを使用する必要があります:http ://www.cplusplus.com/reference/clibrary/cstdio/fgets/バッファオーバーフローの可能性を回避します。

編集:

上記が機能しない場合は、次を試してください。

...
scanf("%d", &a);
getc(stdin);
...
于 2010-03-02T20:34:01.013 に答える
8

scanf改行を消費しないため、の天敵ですfgets。良いハックなしでそれらをまとめないでください。これらのオプションは両方とも機能します。

// Option 1 - eat the newline
scanf("%d", &a);
getchar(); // reads the newline character

// Option 2 - use fgets, then scan what was read
char tmp[50];
fgets(tmp, 50, stdin);
sscanf(tmp, "%d", &a);
// note that you might have read too many characters at this point and
// must interprete them, too
于 2010-03-02T20:49:09.547 に答える
3

scanfは\nを消費しないため、scanfに続くgetによって取得されます。このようにscanfの後に入力ストリームをフラッシュします。

#include <stdlib.h>
#include <string.h>

int main(void) {
   int a;
   char b[20];

   printf("Input your ID: ");
   scanf("%d", &a);
   fflush(stdin);
   printf("Input your name: ");
   gets(b);   

   printf("---------");

   printf("Name: %s", b);   

   system("pause");
   return 0;
}
于 2010-11-16T11:50:07.157 に答える
1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
        int a;
        char b[20];
        printf("Input your ID: ");
        scanf("%d", &a);
        getchar();
        printf("Input your name: ");
        gets(b);
        printf("---------");
        printf("Name: %s", b);
        return 0;
}



Note: 
  If you use the scanf first and the fgets second, it will give problem only. It will not read the second character for the gets function. 

  If you press enter, after give the input for scanf, that enter character will be consider as a input f or fgets.
于 2010-03-03T04:10:10.447 に答える
0

このようにする必要があります。

    fgetc(stdin);
    scanf("%c",&c);
    if(c!='y')
    {
        break;
    }
    fgetc(stdin);

getを読み取った後にscanfから入力を読み取る。

于 2013-08-04T09:50:07.693 に答える
0

2つのgets()関数を使用するだけです

scanf()の後にgets()を使用する場合は、必ず2つのgets()関数を使用し、上記の場合は次のようなコードを記述してください。

int main(void) {
   int a;
   char b[20];

   printf("Input your ID: ");
   scanf("%d", &a);

//the change is here*********************
   printf("Input your name: ");
   gets(b);
   gets(b);   
//the change is here*********************

   printf("---------");

   printf("Name: %s", b);   

   system("pause");
   return 0;
}
于 2016-01-09T09:51:05.637 に答える
0

scanf("%d", &a);%d10進整数のみを受け入れるため、戻り値を読み取ることができません。したがって、バッファ内の最後を無視するため\nに、次の先頭にを追加します。scanf\n

その後、scanf("\n%s", b);問題なく文字列を読み取ることができますが、scanf空白が見つかると読み取りを停止します。したがって、をに変更%s%[^\n]ます。それは、「すべてを読むが\n」という意味です。

scanf("\n%[^\n]", b);

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

int main(void) {
    int a;
    char b[20];

    printf("Input your ID: ");
    scanf("%d", &a);

    printf("Input your name: ");
    scanf("\n%[^\n]", b);
    //first \n says to ignore last 'return'
    //%[^\n] read until find a 'return'  
    printf("---------\n");
    printf("Name: %s\n\n", b);   

    system("pause");
    return 0;
}
于 2016-07-05T17:30:34.117 に答える
0

このscanf関数は、文字以外のものを解析しようとする前に、空白を自動的に削除します。%c、、は%n%[]先頭の空白を削除しない例外です。

gets前に残された改行を読んでいますscanf。を使用して改行をキャッチしますgetchar();

scanf("%d", &a);
getchar(); // catches the newline character omitted by scanf("%d")
gets(b);

https://wpollock.com/CPlus/PrintfRef.htm

于 2017-01-05T04:55:28.203 に答える