C编程中,scanf(" %[^\n]", str)是如何工作的?

7
我在一段C程序中遇到了这个问题:
char str[100];
scanf(" %[^\n]", str);

请解释它是如何工作的,以及为什么?

这意味着扫描所有内容,直到遇到“Enter”即换行符。 - sinsuren
3
一个寻找答案的好来源是文档,其中包含支持格式说明符的解释。 - UnholySheep
2个回答

11

scanf格式字符串由两部分组成:

  • 空格字符,用于跳过输入中的空格字符(' ''\t''\n' 等)
  • %[^\n]转换规范,匹配不包含换行符('\n')的所有字符的字符串,并将其(加上一个终止的 '\0' 字符)存储在 str 中。

请注意,如果输入(在前导空格和第一个换行符之后)超过99个字符,则该函数会出现未定义行为,因为 str 只能容纳100个字符,包括终止的 '\0' 字符。更安全的选择是:

scanf(" %99[^\n]", str);

如果str的大小大于100,除了scanf("%99[^\n]", str)之外,它应该可以正常工作。 - Joy Ram Sen Gupta
它可能有效,也可能无效。它的行为未定义。 - user824425
或者,如果您正在使用现代的libc,char *str=NULL; scanf(" %m[^n]", &str); 然后记得稍后 free(str) - nmichaels
1
你不能只是做 %s 吗? - martiwg

2

[^\n] 搜索换行符

因此它会扫描字符串直到按下回车键


可以说“搜索换行符”吗? - sinsuren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接