额外的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)
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |