scanf()函数中的scanset有什么区别?

Zah*_*977 4 c scanf

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

chq*_*lie 6

额外的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 */
}
Run Code Online (Sandbox Code Playgroud)