我正在尝试读取用户输入并将其存储为包含空格的字符串。我搜索了一个解决方案,并指向fgets()或scanf(%[^ \ n],str)。但这两种解决方案都给我一个错误。
这就是我所拥有的:
//MAX_CHARACTERS is set to 30
scanf("%d", &input);
if (input == 1){
int pr;
char na[MAX_CHARACTERS+1];
printf("\nEnter the name: ");
scanf("%[^\t\n]", &na);
while (strlen(na)>MAX_CHARACTERS){
printf("\nName is too long, enter new name: ");
scanf("%[^\t\n]", &na);
}// end na check
printf("\nEnter priority: ");
scanf("%d", &pr);
while (pr>MAX_PRIORITY || pr <MIN_PRIORITY){
printf("\nBad priority, enter new priority (0-100): ");
scanf("%d", &pr);
}//end pr check
如果我在%s
的所有实例中使用%[^\t\n]
但我使用%[^\t\n]
或
fgets(na, 30, stdin)
,它跳过名字的第一个scanf并直接进入“输入优先级:”。然后,当我打印时,我有一个空白名称,无论我输入什么优先级。
固定IT
因为它不会让我发布答案,
有人想通了。任何人仍然感兴趣,问题是第一个scanf()。
scanf("%d", &input);
它在缓冲区中留下\ n。第二个是取\ n并将其作为输入读取,以便跳过它。
提出
fflush(stdin); //right after the if statement seems to have fixed the issue.
感谢大家的帮助。
答案 0 :(得分:6)
这是使用scanf()
接收用户输入的问题,它不是处理字符串或任何错误输入。 scanf()
用于读取格式化输入(例如,具有严格和特定格式的文件)。当从用户接收输入时,输入可能会出错并导致问题。 您应该使用fgets()
来阅读输入并自行解析。
要回答为什么跳过第二个scanf()
调用,这是因为第一个调用仅消耗输入的数字。但是,按 Enter 的换行符仍然在输入缓冲区中,而是第二次调用的输入。要解决此问题,您需要从输入缓冲区中删除该换行符。最安全的方法是使用getchar()
直到读取换行符,然后继续执行程序。并且避免使用fflush(stdin)
模式,这不安全并且可能导致更多问题而不是它的价值。
这是一个简单的函数,您可以使用它来读取字符,直到读取换行符:
void clear_newlines(void)
{
int c;
do
{
c = getchar();
} while (c != '\n' && c != EOF);
}
在对您处理非字符串数据的scanf()
进行任何调用后调用此方法。
答案 1 :(得分:2)
scanf("%d",&choice);
fgetc(stdin);
我所做的是从stdin读取fgetc,然后离开'\ n',这样你的缓冲区就是crear。
答案 2 :(得分:0)
代码的第一行:
scanf(%d, &input);
应该是:
scanf("%d", &input);
即。引号丢失
答案 3 :(得分:0)
scanf("%[^\t\n]", &na);
应该是:
scanf("%[^\t\n]", na);
即,删除&amp;
此外,fgets应该可以正常工作,除非它包含用户按Enter键时的换行符。你将不得不剥离它。