使用scanf("%[^\n]%*c")读取含空格与空行文本失败的求助
解决scanf无法读取空行的问题
嘿,这个问题我太熟了!咱们先搞清楚为什么scanf("%[^\n]%*c", name)读不了空行——因为%[^\n]的规则是只匹配不等于换行符的字符,空行里全是换行符,它直接就跳过了,根本不会往name里写东西,后面的%*c也只会吃掉那个换行,但空行本身就没被捕获到。你之前在格式串末尾加\n也没用,因为scanf里的空白字符(包括\n)会自动跳过所有空白(空格、换行、制表符等),还是会直接忽略空行的换行符。
下面给你两个靠谱的解决方案:
方案1:用getchar配合scanf手动处理空行
先读取一个字符判断是不是换行(空行的标志),如果是就直接处理空行;如果不是,把字符放回输入流,再用原来的scanf读取非空行:
#include <stdio.h> #include <string.h> int main() { char name[100]; int c; while ((c = getchar()) != EOF) { if (c == '\n') { // 处理空行:把name设为空字符串 name[0] = '\0'; printf("捕获到空行:「%s」\n", name); continue; } // 把读取到的非换行字符放回输入流 ungetc(c, stdin); // 读取非空行,%*c吃掉末尾的换行 scanf("%[^\n]%*c", name); printf("捕获到非空行:「%s」\n", name); } return 0; }
方案2:用fgets(更推荐!)
fgets()是处理行输入的利器,它会读取包括换行符在内的整行内容,自然也能捕获空行(空行就是一个单独的换行符)。你只需要在读取后手动去掉末尾的换行符即可:
#include <stdio.h> #include <string.h> int main() { char name[100]; while (fgets(name, sizeof(name), stdin) != NULL) { // 去掉末尾的换行符(如果存在) size_t len = strlen(name); if (len > 0 && name[len - 1] == '\n') { name[len - 1] = '\0'; } // 此时name就是整行内容,空行的话就是空字符串 printf("捕获到行:「%s」\n", name); } return 0; }
为什么更推荐fgets?因为它天生支持所有行类型,不仅能处理空行,还能避免scanf常见的缓冲区溢出问题(只要你指定了正确的缓冲区大小),用法也更直观。
内容的提问来源于stack exchange,提问作者Prg
相关产品推荐
相关产品推荐

