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

C++ 输入整数n后读取n行句子并输出单词数最多句子的问题解决

问题原因
  • 语法错误:cin >> n 后的cin.ignore漏写了括号,实际为无效代码,没有执行忽略cin >> n残留的换行符的逻辑,导致后续第一次读取行直接读到空内容。
  • 字符串修改问题:strtok是破坏性拆分函数,会直接在传入的原字符串的分隔符位置插入\0截断内容,遍历完单词后原text数组仅保留第一个单词,此时赋值给text2自然只能得到第一个单词。
  • 换行符残留问题:cin.get()读取行时遇到换行符会停止读取,但不会把换行符从输入缓冲区中移除,导致下一次调用cin.get()时直接读取到换行符,返回空串,无法正常读取后续行。
修复方案
  1. 补全cin.ignore()的括号,忽略cin >> n后残留的换行符
  2. 每次读取到text后,先将text拷贝到临时变量aux,再对aux做strtok拆分统计单词数,原text保持完整
  3. 每次调用cin.get()读取完一行后,额外调用一次cin.ignore()丢弃缓冲区残留的换行符

修复后完整代码:

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    int n, i, cnt1=0, cnt2=0;
    char text[256], text2[256]="", aux[256];
    char *p;
    cin >> n;
    cin.ignore(); // 补全括号,忽略n后的换行
    for(i=0; i<n; i++)
    {
        cnt1 = 0;
        cin.get(text, 256);
        cin.ignore(); // 忽略当前行末尾的换行符
        strcpy(aux, text); // 先拷贝到临时变量再拆分
        p = strtok(aux, " ");
        while(p != NULL)
        {
            cnt1++;
            p = strtok(NULL, " ");
        }
        if(cnt1 > cnt2)
        {
            cnt2 = cnt1;
            strcpy(text2, text); // 复制完整的原句子
        }
    }
    cout << text2 << endl;
    return 0;
}

内容的提问来源于stack exchange,提问作者MickeyMoise

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:07