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

为何读取字符串vector到字符指针数组的C++程序无输出?

问题排查与修复

核心问题:输入循环未终止

你的程序卡住的原因是while (cin >> input)会持续读取输入,直到遇到输入结束符才会退出循环。不同系统触发结束符的操作不同:

  • Windows系统:按下 Ctrl + Z 后回车
  • Linux/macOS系统:按下 Ctrl + D

如果不触发这个结束符,程序会一直等待新输入,表现为“卡住无输出”。你手动按Ctrl-C退出时,程序还未执行到打印逻辑,因此只显示部分内容。

代码优化建议

核心问题解决后,你的代码还可以简化,利用string的c_str()方法直接获取C风格字符串,避免手动逐个字符拷贝:

#include <iostream>
#include <string>
#include <vector>
#include <cstring> // 用于strcpy函数

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main()
{
    cout << "Enter some strings (press Ctrl+Z/Ctrl+D to end input):" << endl;
    
    vector<string> svec;
    string input;
    
    while (cin >> input) {
        svec.push_back(input);
    }
    
    size_t sarr_sz = svec.size();
    char **sarr = new char*[sarr_sz];
    
    for (size_t i = 0; i < svec.size(); ++i) {
        const char* c_str = svec[i].c_str();
        // 分配内存,包含字符串末尾的'\0'
        sarr[i] = new char[strlen(c_str) + 1];
        // 直接拷贝C风格字符串
        strcpy(sarr[i], c_str);
    }
    
    cout << "Vector contents:" << endl;
    for (const auto& str : svec) { // 范围for循环更简洁
        cout << str << " ";
    }
    cout << endl;
    
    cout << "Character pointer array contents:" << endl;
    for (size_t i = 0; i < sarr_sz; ++i) {
        cout << sarr[i] << " ";
    }
    cout << endl;
    
    // 释放内存
    for (size_t i = 0; i < sarr_sz; ++i) {
        delete [] sarr[i];
    }
    delete [] sarr;
    
    return 0;
}

优化点说明

  • 添加输入结束操作提示,避免用户因不知道终止方式导致程序卡住
  • 用string::c_str()结合strcpy完成字符串拷贝,替代手动循环赋值,减少冗余代码
  • 使用范围for循环遍历vector,代码更简洁易读

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:05:26