我已阅读有关这些问题的所有问题,但我没有找到%[^\n]s
函数中%[^\n]
和scanf()
之间差异的解释。
答案 0 :(得分:4)
s
之后的额外%[^\n]
是一个常见错误。它可能来自于扫描集和%s
转换说明符之间的混淆。
它在scanf
格式字符串中的效果与输入流中的s
字节匹配。这样的匹配总是会失败,因为在成功转换%[^\n]
说明符之后,流在文件末尾或待处理字符是换行符。除非格式字符串中还有其他转换说明符,否则此失败对scanf()
的返回值没有影响,因此此错误很少成为问题。
另请注意这些警告:
%[^\n]
说明符将在空行上失败。%[]
和%s
说明符转换的最大字节数,以避免在意外大的输入上出现未定义的行为,这样更安全。scanf("%99[^\n]", line)
会在输入流中保留换行符,您必须使用它才能读取具有相同scanf
格式字符串的下一行。与while (fgets(line, sizeof line, stdin)) { ... }
相反,您不能简单地写while (scanf("%99[^\n]", line) == 1) { ... }
来逐行读取整个文件,您必须使用循环体中的挂起换行符并且循环将在第一个空时停止线。
示例:
char line[100];
if (scanf("%99[^\n]", line) == 1) {
/* handle input line */
} else {
/* stream is at end of file or has an empty line */
}
答案 1 :(得分:0)
在[^\n
中添加scanf()
]意味着跳过任何新的行字符。它消耗了除新行char之外的所有内容。
*标志表示不应进行任何分配。在这种情况下* char。 [\ n]跳过任何主要换行符
换句话说:%*[^\n]
扫描意味着一切直到\ n(不会扫描\ n)并丢弃。