拨打电话后scanf("%d", &variable);
我们留下了一个换行符挂在stdin,应在调用之前清除fgets
,或者我们最终给它提供一个换行符并使其过早返回。
我找到了建议使用的答案scanf("%*[^\n]%*c");
第一次致电后scanf
放弃换行符和其他建议使用scanf("%*[^\n]\n");
。理论上,两者都应该有效:第一个会消耗所有不是换行符的内容(但不包括换行符本身),然后消耗exactly一个字符(换行符)。第二个将消耗所有不是换行符(不包括它)的内容,然后\n
,一个空白字符,将指示scanf
读取每个空白字符,直到第一个非空白字符。
然而,尽管我认为这些方法在某些答案中有效,但我无法让它们在这里工作(代码如下)。
为什么两者都没有scanf
方法有效吗?
测试于:
Ubuntu Linux -gcc
5.4.0
scanf("%*[^\n]\n");
方法:
#include <stdio.h>
int main(int argc, char **argv){
int number;
char buffer[1024];
printf("Write number: \n");
scanf("%d", &number);
//Clearing stdin?
scanf("%*[^\n]\n");
printf("Write phrase: \n");
fgets(buffer, 1024, stdin);
printf("\n\nYou wrote:%u and \"%s\"\n", number, buffer);
return 0;
}
Output:
$ ./bug
Write number:
2
Write phrase:
You wrote:2 and "
"
scanf("%*[^\n]%*c");
方法:
#include <stdio.h>
int main(int argc, char **argv){
int number;
char buffer[1024];
printf("Write number: \n");
scanf("%d", &number);
//Clearing stdin?
scanf("%*[^\n]%*c");
printf("Write phrase: \n");
fgets(buffer, 1024, stdin);
printf("\n\nYou wrote:%u and \"%s\"\n", number, buffer);
return 0;
}
Output:
$ ./bug2
Write number:
3
Write phrase:
You wrote:3 and "
"
以下方法是唯一能够按预期方式工作的方法:
工作方式:
#include <stdio.h>
int main(int argc, char **argv){
int number;
char buffer[1024];
printf("Write number: \n");
scanf("%d", &number);
//Clearing stdin!
int c;
while((c = getchar()) != '\n' && c != EOF){
//Discard up to (and including) newline
}
printf("Write phrase: \n");
fgets(buffer, 1024, stdin);
printf("\n\nYou wrote:%u and \"%s\"\n", number, buffer);
return 0;
}
Output:
$ ./notbug
Write number:
4
Write phrase:
phrase :D
You wrote:4 and "phrase :D
"