连续读入多个单词,然后统计这些单词的个数、总长度。直到输入结束:(按下 Ctrl +z, 就会输入一个特殊的字符:文件结束符 EOF)分别使用 C 和 C++实现。

本文比较了C++和C语言版本的代码,展示了如何在控制台程序中接收用户输入的多个单词并计算其总数和总长度,使用了`cin`和`scanf`函数。

C++版本:

#include <iostream>
#include <string>
#include <Windows.h>

using namespace std;
int main(void) {
    string word;
    int length = 0;
    int count = 0;
    cout << "请输入多个单词:\n" << endl;
    while (1)
    {    
        // 输入成功时,返回 cin 对象本身
        // 遇到文件结束符(ctrl+z),而导致输入失败时,结束输入

        if ((cin >> word).eof())//cin对象调用eof()函数获取是否已经到了文件结束符
        {
            break;
        }

        count++;
        length += word.length();
    }
    cout << "总共有" << count << "个单词" << endl;
    cout << "单词的总长度是" << length << endl;

    system("pause");
    return 0;
}

C语言版本:

#include <stdio.h>
#include <string.h>
#include <Windows.h>

int main(void) {
    char word[100];
    int length = 0;
    int count = 0;
    printf( "请输入多个单词:\n" );

    while (1)
    {
        // 输入失败 返回 0
        // 遇到文件结束符 (ctrl+z),返回-1(EOF)

        if (scanf(%s,word)==-1){
            break;
        }

        count++;
        length += strlen(word);
    }
    printf ( "总共有 %d个单词\n",count );
    printf("单词的总长度是 %d\n",  length );

    system("pause");
    return 0;
}

你提到: > “这个程序在运行时需要用户手动按 `Ctrl+Z` 来结束输入” 但我们前面分析过:**你的程序是“有界输入”结构,根本不需要 `Ctrl+Z`!** 如果它现在 **真的需要你按 `Ctrl+Z` 才能退出或输出结果**,那说明: 👉 **你的代码已经被修改成了“无限读取”模式,不再是原来那个基于 `m` `s` 的固定结构。** --- ## 🔍 第一步:确认你当前的代码是不是下面这种错误写法? ### ❌ 错误示例:等待 EOF 的无限循环(导致必须按 Ctrl+Z) ```cpp int main() { int s; while (cin >> s) { // ← 问题在这里! test(s); } } ``` 或者: ```cpp vector<int> result; int s; while (cin >> s) { result.push_back(test(s)); // 没有预先读 m,一直等输入 } ``` 这类写法会一直等待输入直到遇到 **文件结束符 EOF**(Windows 上就是 `Ctrl+Z`,Unix/Linux 是 `Ctrl+D`)才会跳出循环。 ✅ 所以:**如果你现在的 `main()` 函数没有先读 `m`,而是直接用 `while(cin >> ...)` 循环读取,那就必须按 `Ctrl+Z` 结束!** --- ## ✅ 正确写法(回顾):不需要 Ctrl+Z ```cpp int main() { int m; cin >> m; // 先读测试组数 m vector<int> result(m); for (int g = 0; g < m; ++g) { int s; cin >> s; // 再读每组长度 s result[g] = test(s); // 自动读 s 个数字 } // 输出结果 for (int d = 0; d < m; ++d) { cout << (result[d] == 1 ? "Yes" : "No") << endl; } return 0; // 程序自动结束,无需 Ctrl+Z } ``` 这个版本只要输入完指定数量的数据就会自动运行完毕并退出。 --- ## 🧪 示例输入(只需回车即可完成) ``` 2 6 1 2 -5 9 4 5 4 3 5 5 4 ``` 然后在最后一行按一下回车 → 程序读完所有数据 → 输出: ``` Yes No ``` → 自动结束! --- ## ✅ 如何避免使用 `Ctrl+Z`?解决方案总结 | 目标 | 解决方法 | |------|----------| | ✅ 不用手动按 `Ctrl+Z` | 使用**定长输入控制变量 `m` `s`** | | ✅ 用户友好输入体验 | 提前告诉程序要处理多少组数据 | | ✅ 防止卡住 | 不要用 `while(cin >> x)` 这种无界读取 | --- ## 💡 常见误解澄清 | 误解 | 澄清 | |------|------| | “C++ 程序都需要 `Ctrl+Z` 结束输入” | ❌ 只有无限读取才需要 | | “不按 `Ctrl+Z` 就不能运行” | ❌ 输入完整后程序自然继续执行 | | “终端没反应就是程序错了” | ❌ 更可能是输入格式不对或少敲了回车 | --- ## ✅ 调试建议:加日志判断卡在哪 在关键位置打印调试信息,帮助判断是否卡住: ```cpp int main() { int m; cout << "请输入测试组数 m: "; cin >> m; cerr << "[DEBUG] 已读入 m = " << m << endl; vector<int> result(m); for (int g = 0; g < m; ++g) { int s; cout << "请输入第 " << g+1 << " 组数据的长度 s: "; cin >> s; cerr << "[DEBUG] 开始读取长度为 " << s << " 的数组..." << endl; result[g] = test(s); } cout << "结果:" << endl; for (int d = 0; d < m; ++d) { cout << (result[d] == 1 ? "Yes" : "No") << endl; } } ``` 这样你可以清楚看到程序执行到了哪一步。 --- ## ✅ 最终结论 > **只要你使用的是“先读 `m`,再循环 `m` 次”的结构,就不需要按 `Ctrl+Z`!** 如果你现在还必须按 `Ctrl+Z`,那是因为: 🔧 **你的 `main()` 函数被改成了无限读取模式(如 `while(cin >> s)`),而不是原始的 `for(int i=0; i<m; i++)` 结构。** --- ## ✅ 修复步骤 1. 检查 `main()` 是否包含类似: ```cpp while (cin >> s) ``` → 改成: ```cpp cin >> m; for (int i = 0; i < m; ++i) { ... } ``` 2. 确保输入完成后最后有一行回车。 3. 推荐用文件重定向测试: ```cpp freopen("in.txt", "r", stdin); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值