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

