为何读取字符串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
相关产品推荐
相关产品推荐

