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

如何以换行符为分隔符输入字符串数组?代码循环无法退出求助

解决你的C++输入循环退出问题

嘿,我来帮你排查下代码里的问题!你的循环没法退出,还有几个隐藏的bug,咱们一步步拆解:

核心问题分析

  1. cin >> 会跳过空白字符
    cin >> 运算符默认会忽略所有空白(包括换行、空格、制表符),所以你永远没法通过它读到换行符,strcmp(a[i],"\n") 这个条件永远不可能成立,循环自然停不下来。

  2. 循环逻辑错误,访问未初始化内存
    你在do块里先执行 cin>>a[i]; i++;,然后while条件里用 strcmp(a[i],"\n")——这时候a[i]是还没被赋值的内存,全是随机垃圾值,完全不是你输入的内容,逻辑彻底走偏了。

  3. for循环的笔误
    最后输出的循环里,你写的是 for(int j=0;j<i;i++),这里应该是 j++ 而不是 i++,不然会直接导致数组越界或者死循环。

修复后的代码方案

推荐用 getline() 来读取整行输入,它能正确识别换行符,还能读取带空格的行。这里给你两个版本:

版本1:用std::string更简洁(推荐)

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

int main() {
    int i = 0;
    char a[100][100];
    string line;

    // 读取每行,直到输入空行(直接按回车)退出
    while (getline(cin, line)) {
        if (line.empty()) {
            break;
        }
        // 将string转存到char数组,注意防止溢出
        strncpy(a[i], line.c_str(), 99);
        a[i][99] = '\0'; // 确保字符串有结束符
        i++;
        if (i >= 99) break; // 避免数组越界
    }

    // 输出所有输入内容
    for (int j = 0; j < i; j++) {
        cout << a[j] << endl;
    }
    return 0;
}

版本2:纯char数组实现

如果你坚持用char数组,可以用cin.getline():

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

int main() {
    int i = 0;
    char a[100][100];

    do {
        // 读取整行到a[i],最多99个字符+结束符
        cin.getline(a[i], 100);
        // 如果是空行(直接回车),退出循环
        if (strlen(a[i]) == 0) {
            break;
        }
        i++;
    } while (i < 99); // 限制最大行数,防止数组越界

    // 输出内容
    for (int j = 0; j < i; j++) {
        cout << a[j] << endl;
    }
    return 0;
}

关键说明

  • 用getline()可以完整读取用户输入的每一行,包括空格,直到遇到换行符。
  • 加入了数组越界保护,避免输入超过100行导致内存溢出。
  • 空行判断(直接按回车)作为退出条件,符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:05:42