C语言实现单词逐行打印时最后一个单词无法输出的问题
问题原因
最后一个单词不输出是典型的边界处理遗漏:你代码里只有遍历到非字母、非数字的分隔符(比如空格)时,才会终止当前单词的缓存、执行打印逻辑。测试输入It is a cat的末尾没有额外分隔符,for循环跑完最后一个字符t就直接结束,存好的最后一个单词根本没机会触发打印。
另外代码里还有3个容易踩的小问题:
- 头文件拼写错误:首行
#incnlude <stdio.h>拼错了,正确写法是#include <stdio.h> - 数字处理逻辑漏了索引递增:处理数字字符的分支中,给
word[j]赋值后没有写j++,后续字符会覆盖当前位置,遇到含数字的单词会存储异常 - 用了已经被废弃的危险函数:
gets()不做输入长度检查,存在缓冲区溢出风险,早就被C标准移除,替换成fgets()更安全
修复方法
在for循环结束、return 0之前,加一段边界判断:如果遍历完整个字符串时,还处于记录单词的状态,就手动给当前缓存的单词补字符串结束符\0,执行打印。同时把上面提到的3个小问题一起修复即可。
修复后的完整代码:
#include <stdio.h> #include <string.h> int main() { char s[1002],word[100]; int i,j,length, is_word_started; fgets(s, sizeof(s), stdin); length = strlen(s); is_word_started = 0; for(i = 0,j = 0;i < length;i++) { if(s[i] >= 'a' && s[i] <= 'z') { if(is_word_started == 0) { is_word_started = 1; word[j] = 'A' + s[i] - 'a'; j++; } else { word[j] = s[i]; j++; } } else if(s[i] >= 'A' && s[i] <= 'Z') { if(is_word_started == 0) { is_word_started = 1; } word[j] = s[i]; j++; } else if(s[i] >= '0' && s[i] <= '9') { if(is_word_started == 0) { is_word_started = 1; } word[j] = s[i]; j++; } else { if(is_word_started == 1) { is_word_started = 0; word[j] = '\0'; printf("%s\n",word); j = 0; } } } // 处理字符串末尾的最后一个单词 if (is_word_started == 1) { word[j] = '\0'; printf("%s\n", word); } return 0; }
编译运行后输入It is a cat,就能得到预期输出:
It is A Cat
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

