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应该可以正常工作,除非它包含用户按下回车键时的换行符。 你将不得不剥离它。