在下面代码的循环中,scanf("%[^\n]s",array)
无效。它不等待输入并被跳过。但是%
之前的空格修复了这个问题。为什么呢?
这是错误的程序:
#include <string.h>
#include <stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--){
char arr[199];
scanf("%[^\n]s",arr);
printf("%s",arr);
}
return 0;
}
这是正确的代码:
#include <string.h>
#include <stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--){
char arr[199];
scanf(" %[^\n]s",arr);
printf("%s",arr);
}
return 0;
}
为什么%
之前需要空格才能按预期工作?
答案 0 :(得分:2)
首先,s
的尾随%[
不是%[^\n]
格式说明符的一部分,因此请将其删除,然后讨论%[^\n]
。
现在,scanf
告诉'\n'
要做的是扫描所有内容,直到换行符(EOF
)或arr
,以先到者为准,并将其存储在相应的在这种情况下,%[^\n]
。
以下是问题: \n
如果要读取的第一个字符是scanf
则会失败。
'等等'。 '我没有输入单独输入。那么,它为什么会失败?'。真正。你没有。但请记住你为前一行按下的 Enter ?事实证明,之前对\n
的调用会抓取所有内容,直到\n
,离开scanf
并返回。因此,在循环的下一次迭代中,\n
看到前一次调用scanf
时遗留的scanf
字符,失败并返回0.
至于空间,它是一个空白字符。 \n
中的空白字符指示它扫描并丢弃所有空白字符,直到第一个非空白字符。因此,它删除了scanf
(因为它是一个空格字符),{{1}}将等待进一步的输入。
答案 1 :(得分:1)