scanf()函数中的扫描集有什么区别?

时间:2018-05-12 12:19:36

标签: c scanf

我已阅读有关这些问题的所有问题,但我没有找到%[^\n]s函数中%[^\n]scanf()之间差异的解释。

2 个答案:

答案 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)并丢弃。

相关问题