kannal 2025-09-04 16:53 采纳率: 100%
浏览 5
已结题

c语言找出一个句子中最长的单词输出它的长度以及它本身,结果为什么这样,如图


#include <stdio.h>
#include <string.h>
int fun1(char c)
{
    if (c==' ')
        return 0;
    else
        return 1;
}
void fun2(char str[],char word[])
{
    int i,j;
    int max = 0, current = 0, start = 0;
    for (i = 0; str[i] != '\0'; i++)
    {
        char c= str[i];
        if (fun1(c))
        {
            current++;
        }
        else
        {
            if (current > max)
            {
                max = current;
                start = i - current;
            }
            current = 0;
        }
        if (current > max)//处理最后一个单词;
        {
            max = current;
            start = i - current;
        }
    }
    for (j = 0; j < max; j++)
    {
        word[j] = str[start + j];
    }
    word[max] = '\0';
    printf("%d", max);
}
int main()
{
    char str[1000],word[1000];
    gets_s(str);
    fun2(str, word);
    printf("\n");
    puts(word);
}

img

  • 写回答

6条回答 默认 最新

  • 檀越@新空间 2025-09-04 17:06
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你提供的 C 语言代码旨在找出一个句子中最长的单词,并输出它的长度和内容。但是,这段代码存在一些逻辑错误和语法问题,导致结果可能不符合预期。


    一、问题分析

    1. fun1 函数的作用

    int fun1(char c)
    {
        if (c==' ')
            return 0;
        else
            return 1;
    }
    

    这个函数判断字符是否为空格,返回 0 表示是空格,否则返回 1。这部分逻辑没有问题。


    2. fun2 函数的问题

    (1) if (current > max) 的位置不正确

    在循环中,if (current > max) 被放在了 else 块内部,这会导致只有在遇到空格后才检查当前单词长度,而最后一个单词不会被处理

    重点: 最后一个单词如果没有被空格结束,将无法被记录到 max 中。

    (2) start = i - current; 的计算方式有问题

    i 处于某个位置时,current 是从上一个空格之后开始计算的连续非空格字符数。例如:

    • 如果 i=5current=3,那么 start = 5 - 3 = 2,表示从索引 2 开始取 3 个字符(即 str[2], str[3], str[4]),这是正确的。
    • 但如果 i 是末尾(比如 i=9),此时 current=3start = 9 - 3 = 6,也表示从 str[6] 开始取 3 个字符,是正确的。

    所以这一部分逻辑没问题。

    (3) if (current > max) 在最后的位置

    你试图通过在循环结束后再次判断 current > max 来处理最后一个单词,但该判断被放在了 for 循环内,而不是在循环外。这样会导致它只在每次循环中判断一次,不能覆盖整个字符串。


    二、解决方案

    修改建议如下:

    1. if (current > max) 放在循环外部,确保最后一个单词也能被处理。
    2. 优化 fun2 函数逻辑,使其更清晰且无遗漏。

    三、修改后的代码

    #include <stdio.h>
    #include <string.h>
    
    int fun1(char c) {
        if (c == ' ')
            return 0;
        else
            return 1;
    }
    
    void fun2(char str[], char word[]) {
        int i, j;
        int max = 0, current = 0, start = 0;
    
        for (i = 0; str[i] != '\0'; i++) {
            char c = str[i];
            if (fun1(c)) {
                current++;
            } else {
                if (current > max) {
                    max = current;
                    start = i - current;
                }
                current = 0;
            }
        }
    
        // 检查最后一个单词
        if (current > max) {
            max = current;
            start = i - current;
        }
    
        // 提取最长单词
        for (j = 0; j < max; j++) {
            word[j] = str[start + j];
        }
        word[max] = '\0';
    
        printf("%d\n", max);
        puts(word);
    }
    
    int main() {
        char str[1000], word[1000];
        gets_s(str);  // 注意:gets_s 是 C11 标准,某些编译器可能不支持
        fun2(str, word);
        return 0;
    }
    

    四、测试样例与结果说明

    ✅ 示例输入:

    Hello world this is a test sentence
    

    ✅ 输出结果:

    8
    sentence
    

    ✅ 解释:

    • 句子中的单词有:Hello, world, this, is, a, test, sentence
    • 最长单词是 "sentence",长度为 8

    五、注意事项

    1. 使用 gets_s 时要注意安全性gets_s 是 C11 标准中推荐的安全版本,但在某些编译器(如 GCC)中可能不支持。可以替换为 fgets

      fgets(str, sizeof(str), stdin);
      
    2. 避免内存越界:确保 strword 数组足够大,以防止溢出。


    六、总结

    • 原代码问题:最后一个单词未被正确识别。
    • 修改点:将 if (current > max) 移到循环外,确保最后一个单词也能被处理。
    • 最终效果:能正确找到最长单词并输出其长度和内容。

    如果你还有其他问题或需要进一步优化,请继续提问!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 9月12日
  • 已采纳回答 9月4日
  • 创建了问题 9月4日