如何获取每个输入句子的最后一个单词?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; }
修正说明
- 替换
gets为fgets,并通过strcspn去除换行符,保证字符串格式正确。 - 新增
count变量记录有效句子数,输出时只循环处理这些有效内容,避免访问未初始化的数组元素。 - 调整
last_word的定义位置并初始化,解决作用域和未初始化问题。 - 修改
strtok的分隔符,确保能正确拆分出句子中的每个单词,忽略无关的标点和空白。 - 增加空指针判断,处理极端情况(比如输入的句子没有有效单词)。
内容的提问来源于stack exchange,提问作者mary
相关产品推荐
相关产品推荐

