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