Claudine 01 2024-12-27 18:04 采纳率: 50%
浏览 30
已结题

关于#c++#的问题:华科C++大一SPOC第六章第二题

题干如下
2最长单词(35分)
题目内容:
输入一段英文句子(不包含标点符号),求期中最长的一个单词(如果有多个最长单词,以最左边的为准),并输出该单词。
主函数已给出,请编写函数longest( ),完善程序。

#include <iostream>
using namespace std;
int main()
{
     char c1[1000];
     char c2[100];
     cin.getline(c1,1000);
     longest(c1,c2);
     cout<<c2<<endl;
     return 0;
} 

输入格式:
一段英文句子
输出格式:
英文句子中的最长单词

输入:in order to get true happiness,初始代码如下,输出结果为order;

#include <iostream>
using namespace std;
void longest(char *sentence,char *word)
{
    int m=0,n=0,position=0;
    for(int i=0;sentence[i]!='\0';i++)
    {
        if(sentence[i]>='A'&&sentence[i] <= 'z')
            m++;
        else
        {
            if(m>n) 
            {
                n=m;
                position=i-m;
            }
            m=0;
        }
    }
    for(int i=0;i<n;i++)
    {
        word[i]=sentence[i+position];
    }
    word[n]=0;
}
int main()
{
     char c1[1000];
     char c2[100];
     cin.getline(c1,1000);
     longest(c1,c2);
     cout<<c2<<endl;
     return 0;
}
 

而改成以下代码后输出结果就变成happiness,请问初始代码为什么错了

#include <iostream>
using namespace std;
void longest(char *sentence,char *word)
{
    int m=0,n=0,position=0;
    for(int i=0;i==0||sentence[i-1]!='\0';i++)
    {
        if(sentence[i]>='A'&&sentence[i] <= 'z')
            m++;
        else
        {
            if(m>n) 
            {
                n=m;
                position=i-m;
            }
            m=0;
        }
    }
    for(int i=0;i<n;i++)
    {
        word[i]=sentence[i+position];
    }
    word[n]=0;
}
int main()
{
     char c1[1000];
     char c2[100];
     cin.getline(c1,1000);
     longest(c1,c2);
     cout<<c2<<endl;
     return 0;
} 

  • 写回答

14条回答 默认 最新

  • qq_230177505762 优质创作者: 嵌入式与硬件开发技术领域 2024-12-27 18:05
    关注

    以下参考免费微信小程序:皆我百晓生 作答,并由本人整理回复。

    初始代码中存在几个问题,导致它不能正确地找出最长的单词。让我们逐步分析并解释为什么初始代码是错误的,以及如何修正这些问题。

    初始代码的问题

    1. 字符范围判断错误: 初始代码中,字符判断使用的是 sentence[i] >= 'A' && sentence[i] <= 'z',这会导致只有大写字母和小写字母之间的字母被识别为单词的一部分。但是,正确的范围应该是 sentence[i] >= 'A' && sentence[i] <= 'Z' || sentence[i] >= 'a' && sentence[i] <= 'z',这样可以确保所有大小写字母都被识别。

    2. 循环条件错误: 初始代码中的循环条件是 for(int i=0; sentence[i] != '\0'; i++),这个条件会导致循环在遇到字符串末尾的空字符 '\0' 时停止,而不是在字符串实际结束之前。这会导致最后一个单词(如果有的话)被忽略。

    3. 单词起始位置计算错误: 初始代码中,position 被设置为 i - m,这意味着单词的起始位置是基于当前位置向前数 m 个字符来确定的。这个计算在某些情况下是不正确的,因为它没有考虑到单词之间的空格。

    4. 单词复制逻辑错误: 初始代码中的单词复制逻辑 for(int i=0; i<n; i++) { word[i]=sentence[i+position]; } 可能会复制错误的单词,因为它没有考虑到单词之间的空格。

    修正后的代码

    修正后的代码如下,它解决了上述问题,并确保能够正确地找出并输出最长的单词:

    #include <iostream>
    #include <cstring> // 用于strlen函数
    using namespace std;
    
    void longest(char *sentence, char *word) {
        int m = 0, n = 0, position = 0;
        bool inWord = false; // 标记是否在单词中
        for (int i = 0; sentence[i] != '\0'; i++) {
            // 检查是否是字母
            if ((sentence[i] >= 'A' && sentence[i] <= 'Z') || (sentence[i] >= 'a' && sentence[i] <= 'z')) {
                if (!inWord) { // 如果不在单词中,标记开始,并记录位置
                    inWord = true;
                    position = i;
                }
                m++;
            } else {
                if (m > n) { // 如果当前单词长度大于已记录的最长单词长度
                    n = m;
                    // 更新word指向的起始位置
                    memcpy(word, sentence + position, n);
                    word[n] = '\0'; // 确保字符串结束
                }
                m = 0; // 重置m
                inWord = false; // 标记不在单词中
            }
        }
        // 检查最后一个单词是否是最长的
        if (m > n) {
            memcpy(word, sentence + position, m);
            word[m] = '\0';
        }
    }
    
    int main() {
        char c1[1000];
        char c2[100];
        cin.getline(c1, 1000);
        longest(c1, c2);
        cout << c2 << endl;
        return 0;
    }
    

    这段代码通过引入一个布尔变量 inWord 来标记是否处于单词中,这样可以正确地处理单词的开始和结束。同时,它使用 memcpy 函数来复制单词,这样可以避免手动复制时可能出现的错误。最后,它还检查了字符串末尾的单词是否是最长的,以确保正确输出。

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

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月27日
  • 已采纳回答 12月27日
  • 创建了问题 12月27日