fflush替代方案

时间:2013-01-08 21:25:15

标签: c string generics

我错误地使用fflush(stdin)来刷新stdin流的剩余部分,如下所示:

printf("Gimme number");
scanf("%d",&number);
fflush(stdin);
printf("Gimme string");
gets(string);

当然我已经包含了头文件和其余的..我知道fflush用于stdout而不用于stdin,但我非常需要一个替代方案才能在scanf之后使用一个获取。我在这里搜索了旧帖子,但我只看到了关于scanf的建议(“%c \ n”,c); 。当我执行scanf(“%d \ n”,x)时,这会使程序崩溃。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

一种可能性是使用scanf之类的内容消费getchar()留下的换行符:

printf("Gimme number");
scanf("%d",&number);
getchar();
printf("Gimme string");
gets(string);

另一种可能性就是使用scanf:

printf("Gimme number");
scanf("%d",&number);
printf("Gimme string");
scanf(" %99s", string);

如果您将99替换为字符串缓冲区的长度,请注意%之前的空格,以确保它忽略{{1}上留下的空格(或制表符或换行符) }}

答案 1 :(得分:0)

从输入中读取整行(包含ENTER的行)。 解析这些行(可能包含strtol()srttod()sscanf())。

char buffer[1000];
int number;
printf("Gimme number: ");
fflush(stdout);
fgets(buffer, sizeof buffer, stdin); // needs error checking
number = strtol(buffer, &err, 10); // needs error checking
printf("Gimme string: ");
fflush(stdout);
fgets(buffer, sizeof buffer, stdin); // needs error checking
strcpy(string, buffer);
string[strlen(string) - 1] = 0; // remove ENTER