如何修改C语言代码实现打印去除最长单词后的字符串?
问题描述
我有一段能找出字符串中最长单词的C语言代码,现在需要修改代码,实现打印去除该最长单词后的字符串。示例如下:
输入:"The longest word"
输出:"The word"
原代码如下:
#include <stdio.h> #include <string.h> void LongestWord(char string[100]) { char word[20],max[20],min[20],c; int i = 0, j = 0, flag = 0; for (i = 0; i < strlen(string); i++) { while (i < strlen(string) && string[i]!=32 && string[i]!=0) { word[j++] = string[i++]; } if (j != 0) { word[j] = '\0'; if (!flag) { flag = !flag; strcpy(max, word); } if (strlen(word) > strlen(max)) { strcpy(max, word); } j = 0; } } printf("The largest word is '%s' .\n", max); } int main() { char string[100]; printf("Enter string: "); gets(string); LongestWord(string); }
修改后的代码及说明
完整代码
#include <stdio.h> #include <string.h> void RemoveLongestWord(char string[100]) { char word[20], max[20]; int i = 0, j = 0, flag = 0; int maxLen = 0, startPos = -1, endPos = -1; // 记录最长单词的起止索引 // 第一步:遍历字符串,找出最长单词的位置 for (i = 0; i < strlen(string); i++) { j = 0; // 提取当前单词 while (i < strlen(string) && string[i] != ' ' && string[i] != '\0') { word[j++] = string[i]; i++; } if (j != 0) { word[j] = '\0'; int currentLen = strlen(word); // 更新最长单词信息(默认移除第一个最长单词) if (!flag || currentLen > maxLen) { flag = 1; maxLen = currentLen; strcpy(max, word); startPos = i - currentLen; // 单词起始位置 endPos = i; // 单词结束后的位置(含空格或结束符) } // 若要移除最后一个最长单词,将上面的条件改为 currentLen >= maxLen } } // 第二步:拼接去除最长单词后的新字符串 char result[100] = {0}; if (startPos != -1) { // 复制最长单词之前的内容 strncpy(result, string, startPos); // 跳过最长单词后多余的空格,避免输出多个连续空格 int k = endPos; while (k < strlen(string) && string[k] == ' ') { k++; } // 拼接最长单词之后的内容 strcat(result, string + k); } printf("去除最长单词后的字符串:\"%s\"\n", result); } int main() { char string[100]; printf("请输入字符串:"); // 替换不安全的gets,用fgets读取输入 fgets(string, sizeof(string), stdin); // 去掉fgets自动读取的换行符 string[strcspn(string, "\n")] = '\0'; RemoveLongestWord(string); return 0; }
关键修改点
- 新增
startPos和endPos变量,精准记录最长单词在原字符串中的位置,为后续截取拼接提供依据。 - 拆分逻辑为两步:先定位最长单词,再构造新字符串,代码更清晰易维护。
- 替换了存在缓冲区溢出风险的
gets函数为fgets,并处理了换行符,提升代码安全性。 - 处理了最长单词前后的空格:自动跳过单词后的多余空格,保证输出格式整洁。
- 支持灵活调整移除策略:默认移除第一个最长单词,修改条件即可改为移除最后一个。
内容的提问来源于stack exchange,提问作者coot
相关产品推荐
相关产品推荐

