while(scanf("%s",a))
{
if(a[0]=='#')
break;
nextpermutation(a);
}
这个while循环完美适用于scanf("%s") 但是如果我把scanf("%[^ \ n] s",a)放入其中只运行一次 我检查了两个scanf的返回值,它们仍然是相同的 我不明白为什么会发生这种情况......
答案 0 :(得分:1)
s
中%[^\n]s
做了什么?
您的scanf("%[^\n]s")
在其格式字符串中包含两个格式说明符:%[^\n]
后跟一个s
。这将要求输入流在s
匹配的序列之后包含%[^\n]
。当然,这与普通%s
的行为并不是非常接近。由于这个原因,这些格式的匹配序列将大不相同。
请注意,[]
不是%s
格式的修饰符,因为您似乎错误地相信。 []
中的scanf
是一个自给自足的格式说明符。你的意思是%[^\n]
而不是%[^\n]s
吗?
答案 1 :(得分:1)
两个输家的战斗:"%s"
与"%[^\n]s"
:
两个说明符都是错误并且不属于强健代码。既不限制用户输入,也可以轻松超出目标缓冲区。
s
中的"%[^\n]s"
没有任何意义。 @Jonathan Leffler。因此"%[^\n]"
会在下面进行审核 - 但仍然很糟糕。
"%s"
消耗领先的空白区域。 "%[^\n]"
没有@Igor Tandetnik
"%[^\n]"
,则{p> '\n'
会读取 nothing ,使a
保持不变或很少处于未知状态。
"%[^\n]"
读取除'\n'
以外的所有字符。
"%s"
读取所有前导空格,丢弃它们,然后读取并保存所有非空格。
最好使用fgets()
来读取用户输入,然后解析它。
示例:读取一行输入,包括空格:
char a[100];
if (fgets(a, sizeof a, stdin) == NULL) Handle_EOF_or_Error();
// if the potential trailing \n is not wanted
a[strcspn(a, "\n")] = '\0';