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

如何获取每个输入句子的最后一个单词?C程序输出异常求助

修正你的C程序:提取每个句子的最后一个单词

原代码存在几个关键问题,导致无法正确输出每个句子的最后一个单词:

  • 输入逻辑错误:gets(str)始终指向数组的第一个元素str[0],所有输入的句子都会覆盖之前的内容,最终只保留最后输入的句子。应该改为写入str[i],同时判断输入是否为空串来终止循环。
  • gets函数不安全:gets不检查缓冲区大小,极易引发缓冲区溢出,建议用fgets替代,同时手动去除fgets读取到的换行符。
  • 变量作用域违规:last_word定义在while循环内部,循环结束后该变量已超出作用域,直接访问属于未定义行为,需移到循环外定义并初始化。
  • 分隔符使用错误:原代码用.作为strtok的分隔符,这是按句子分割而非按单词分割。要提取单词,应该用空白字符(空格、制表符)和句点作为分隔符,确保正确拆分每个单词。
  • 输出范围不合理:原代码固定循环10次,但实际输入的句子数量可能少于10,应该记录有效句子的数量,只处理这些有效内容。

以下是修正后的完整代码:

#include <stdio.h>
#include <string.h>

int main() {
    char str[10][100];
    int i, count = 0;

    printf("Enter a sequence of sentences (enter empty line to end):\n");

    for (i = 0; i < 10; i++) {
        // 用fgets读取输入,替代不安全的gets
        if (fgets(str[i], sizeof(str[i]), stdin) == NULL) {
            break;
        }
        // 移除fgets读取到的换行符
        str[strcspn(str[i], "\n")] = '\0';
        // 输入空串则终止循环
        if (str[i][0] == '\0') {
            break;
        }
        count++; // 统计有效句子的数量
    }

    printf("\nThe last word of each of these sentences is:\n");
 
    for (i = 0; i < count; i++) {
        char *word;
        char *last_word = NULL; // 移到循环外定义并初始化
        // 按空白字符和句点拆分单词
        word = strtok(str[i], " \t\n.");
        while (word != NULL) {
            last_word = word;
            word = strtok(NULL, " \t\n.");
        }
        // 确保有单词时才输出,避免空指针访问
        if (last_word != NULL) {
            printf("%s\n", last_word);
        } else {
            printf("(empty sentence)\n");
        }
    }

    return 0;
}

修正说明

  1. 替换gets为fgets,并通过strcspn去除换行符,保证字符串格式正确。
  2. 新增count变量记录有效句子数,输出时只循环处理这些有效内容,避免访问未初始化的数组元素。
  3. 调整last_word的定义位置并初始化,解决作用域和未初始化问题。
  4. 修改strtok的分隔符,确保能正确拆分出句子中的每个单词,忽略无关的标点和空白。
  5. 增加空指针判断,处理极端情况(比如输入的句子没有有效单词)。

内容的提问来源于stack exchange,提问作者mary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:16:16