C语言:如何实现scanf读取的全部字母序列打印?现有代码存在输出遗漏
解决数组内容无法全部打印的问题
嘿,我来帮你搞定这个问题~你遇到的情况是最后一个单词没被打印出来,这完全是因为你用的scanf格式串在处理最后一段输入的时候“卡壳”了,咱们一步步拆解:
原代码的问题所在
你写的格式串是%29[a-zA-Z]%*[^a-zA-Z],它的执行逻辑是:
- 先读取最多29个字母,存到
in数组里 - 接着强制跳过所有非字母字符(
%*表示跳过匹配内容,[^a-zA-Z]匹配非字母)
但当输入到最后一个单词hi时,读完hi之后已经没有后续的非字母字符了(比如输入结束或者换行),这时候第二步的%*[^a-zA-Z]就匹配不到任何内容,导致整个scanf的返回值不是1,循环直接退出,所以hi被读进来了却没机会打印。
两种可行的修复方案
方案一:拆分读取与跳过逻辑(更健壮)
把读取字母和跳过非字母的操作分开,这样即使最后没有非字母字符,也不会影响最后一个单词的打印:
#include <stdio.h> #include <ctype.h> // 需要包含这个头文件来使用isalpha函数 int main() { char in[1000]; printf("read these lines: "); // 循环读取字母段 while (scanf("%29[a-zA-Z]", in) == 1) { printf("%s\n", in); // 跳过后续的非字母字符,直到遇到字母或输入结束 int c; while ((c = getchar()) != EOF && !isalpha(c)) { // 只是跳过,不需要做其他操作 } // 如果读到的不是EOF,把这个字母放回输入流,供下一次读取 if (c != EOF) { ungetc(c, stdin); } } return 0; }
方案二:简化格式串逻辑(更简洁)
直接把跳过非字母的操作变成“尝试执行”,不强制要求它成功,这样即使最后没有非字母,循环也能正常处理最后一个单词:
#include <stdio.h> int main() { char in[1000]; printf("read these lines: "); while (scanf("%29[a-zA-Z]", in) == 1) { printf("%s\n", in); // 尝试跳过非字母字符,不管是否成功 scanf("%*[^a-zA-Z]"); } return 0; }
这两种方案都能解决你的问题,测试输入hel'lo hi的话,都会输出:
hel lo hi
内容的提问来源于stack exchange,提问作者hack
相关产品推荐
相关产品推荐

