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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:35:35