C++程序硬编码输入正常,读取用户输入报Segmentation fault如何解决
问题分析与解决方案
错误原因
段错误的根源是没有给vector预先分配存储空间就直接通过下标写入数据:
- 存储目标单词的
vector<string> w初始化后长度为0,直接使用w[i]写入输入的单词属于非法内存访问 - 存储棋盘的
vector<vector<char>> x初始化后长度为0,直接使用x[i][j]写入棋盘数据同样触发越界
硬编码时你使用初始化列表构造vector,会自动分配对应大小的内存,所以不会触发错误。
修复方案
只需要修改main函数中读取输入的部分,在读取长度后先给对应vector分配空间即可,修复后的代码如下:
int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif vector<string> w ; vector<vector<char>> x; int o,p; cin>>o; // 给单词vector分配o个元素的空间 w.resize(o); for (int i = 0; i < o; ++i) { cin>>w[i]; } cin>>p; // 给棋盘vector分配p行,每行p个字符的空间 x.resize(p, vector<char>(p)); for (int i = 0; i < p; ++i) { // 直接读取整行字符串转成字符数组,适配输入棋盘每行无空格的场景 string s; cin >> s; for (int j = 0; j < p; ++j) { x[i][j] = s[j]; } } vector<string> res = findWords(x,w); for(auto i:res) cout<<i<<" "; return 0; }
内容的提问来源于stack exchange,提问作者Learner07
相关产品推荐
相关产品推荐

