scanf("%s)和scanf("%[^ \ n] s")的返回值之间的差异

时间:2016-11-19 13:34:21

标签: c

while(scanf("%s",a))
{

     if(a[0]=='#')
     break;
     nextpermutation(a);
}

这个while循环完美适用于scanf("%s") 但是如果我把scanf("%[^ \ n] s",a)放入其中只运行一次 我检查了两个scanf的返回值,它们仍然是相同的 我不明白为什么会发生这种情况......

2 个答案:

答案 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';