You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 12:36:20