【发布时间】:2015-03-19 07:50:56
【问题描述】:
我正在尝试编写一个读取各种用户输入的程序。这些字符串输入可以包含或不包含空格。我制作了一个运行良好的版本,但需要一个 while 循环(在 clearStdin 函数内),如下所示:
#include <stdio.h>
#include <stdlib.h>
void clearStdin(void);
int main(void)
{
char name1[8], name2[5];
printf("Write a name: ");
fgets(name1, sizeof name1, stdin);
clearStdin();
printf("Write another name: ");
fgets(name2, sizeof name2, stdin);
clearStdin();
printf("First name is: %s\n", name1);
printf("Second name is: %s\n", name2);
return 0;
}
void clearStdin(void){
int c;
while(( c = getchar() ) != '\n' && ( c != EOF ));
}
我尝试使用
scanf("%7[^\n]", name1);
scanf("%*[^\n]");
scanf("%*c");
还有其他方式。我的问题是:程序还有其他方法可以在不使用 while(或其他)循环的情况下工作吗?只有任何 scanf 或 fgets 方式?
示例输入:
Write a name: RafaelBluhm
Write another name: Tainah Julião
需要的输出:
First name is: RafaelB
Second name is: Tain
输出失败(其他方式):
First name is:Tain
Second name is:@�
【问题讨论】:
-
有没有可能你没有使用 \0 来关闭你的字符串?
-
顺便说一句
char c;clearStdin():应该是int c; -
总是检查每次调用 'fgets; 的返回值;和/或“scanf”以确保操作成功。始终在 scanf() 的格式字符串中放置一个前导 ' ' (空格),这样它将跳过任何前导空格。在 scanf() 中使用 %s 时,请始终设置限制/最大长度,因此不会发生缓冲区溢出。建议使用 fscanf() 而不是 scanf() 最后,我建议使用 fgets() 输入整行,使用 sscanf() 来提取名字/姓氏。并始终在使用 sscanf() 之前将每个名字/姓氏缓冲区清除为 '\0',因此当没有姓氏时,不会打印任何内容。
-
scanf("%8[^\n]", name1);应该是scanf("%7[^\n]", name1); -
OT:使用
stderr作为提示更常见(并且会减少缓冲问题):fputs("Write a name: ", stderr)或fprintf(stderr, "Write a name: ");
标签: c