简单的C scanf不起作用?

Joh*_*ohn 20 c console scanf

如果我尝试以下内容:

int anint;
char achar;

printf("\nEnter any integer:");
scanf("%d", &anint);
printf("\nEnter any character:");
scanf("%c", &achar);
printf("\nHello\n");
printf("\nThe integer entered is %d\n", anint);
printf("\nThe char entered is %c\n", achar);
Run Code Online (Sandbox Code Playgroud)

它允许输入一个整数,然后scanf完全跳过第二个,这真的很奇怪,因为当我交换两个(charscanf优先)时,它工作正常.究竟是什么错了?

cod*_*ict 27

当使用读取输入时scanf,在按下返回键后读取输入,但返回键生成的换行不被消耗scanf,这意味着下次char从标准输入读取时,将准备好读取新行.

要避免的一种方法是使用fgets将输入作为字符串读取,然后使用以下内容提取您想要的内容sscanf:

char line[MAX];

printf("\nEnter any integer:");
if( fgets(line,MAX,stdin) && sscanf(line,"%d", &anint)!=1 ) 
   anint=0;

printf("\nEnter any character:");
if( fgets(line,MAX,stdin) && sscanf(line,"%c", &achar)!=1 ) 
   achar=0;
Run Code Online (Sandbox Code Playgroud)

另一种消费换行的方法是scanf("%c%*c",&anint);.该%*c会从缓冲器读取换行符并将其丢弃.

你可能想读这个:

C FAQ:为什么每个人都说不使用scanf?

  • @Jonathan:你是对的.在'%d`之后我们需要它.是的,`fgets + sscanf`总是更好. (3认同)

caf*_*caf 16

其他答案是正确的 - %c不跳过空格.最简单的方法是在以下位置之前放置空格%c:

scanf(" %c", &achar);
Run Code Online (Sandbox Code Playgroud)

(格式字符串中的任何空格都将scanf消耗所有连续的空格).

  • @cpx:因为换行符是空格.格式字符串中的任何空格都像任何其他空格一样,因此`\n`和空格一样好(但还有一个字母). (2认同)

Jon*_*ler 5

它没有跳过第二个scanf(); 第二个scanf()读取第一个留下的换行符scanf().大多数格式代码跳过空格; 该%c格式不跳过空白.