假设我有以下一段代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main() {
char choice;
char name[5] = "";
do {
printf("a = new name or anything else to quitnChoice: ");
choice = getchar();
//not doing any error handling....assuming you only click 'a'
switch (choice) {
case 'a':
getchar();
printf("Enter a name which is 4 characters or less: ");
fgets(name, 5, stdin);
printf("Name: %sn", name);
char c;
while ((c = getchar()) != 'n' && c != EOF);
printf("%c", c);
c = ' ';
break;
default:
break;
}
} while (choice == 'a');
printf("Ending.....press enter now");
getchar();
return 0;
}
我在这里要测试的是清除缓冲区,当我有超过4个字符输入。当我有一个名字是4个字符或更多的时候,它工作得很好,但是当我遇到3个字符或更少的时候,问题就变成了while循环。它期望从stdin缓冲区中获得getchar(),但这是空的。有什么办法可以解决这个问题?
我们已经在我对你上一个问题的回答的评论中顺便讨论了这个问题。如果缓冲区中有足够的空间,fgets()
将使用终止换行符,并将其放入缓冲区中。您可以通过在缓冲区中查找换行符来确定它是否已经这样做了。如果你找到了,那么
-
您可能想要删除它-例如,通过将其替换为
' '
。 -
您应该避免尝试排干输入行的尾部,因为流已经前进到下一行。
检查name
是否包含换行符。如果是,则缓冲区中没有任何内容,您不需要刷新它。
fgets(name, 5, stdin);
printf("Name: %sn", name);
if (strchr(name, 'n') == NULL) {
int c;
while ((c = getchar()) != 'n' && c != EOF);
}
-
检查
fgets()
结果。除非代码这样做,否则使用name
的内容可能是未定义的行为。避免魔术数字:使用sizeof name
.// fgets(name, 5, stdin); if (fgets(name, sizeof name, stdin) == NULL) Handle_EOF();
-
在
name[]
中寻找电位'n'
。char *eol = strchr(name, 'n');
-
如果找到一个,用空字符覆盖,否则消耗行
的其余部分if (eol) { *eol = ' '; } else { int ch; while ((ch = getchar()) != 'n' && ch != EOF); }
-
Print
name[]
printf("Name: %sn", name);