读取用户输入会出现分段错误,但在硬编码时不会出现相同的输入
Reading user input gives Segmentation fault but not with same input when hardcoded
在发布这个问题之前,我检查了与 Segmentation fault 相关的现有问题,但我无法解决我的错误。
我正在尝试 运行 一个用于以下输入的 C++ 程序,但我遇到了分段错误。
输入:
4
gitohro qf ejvh i
3
gor
pih
sto
预期输出:
gitohro i
当我在我的程序中硬编码输入时,我得到了预期的输出。
但是当我从 user/console 获取输入时,我得到了 Segmentation fault error.
实际错误信息:
/bin/sh: line 1: 22094 Segmentation fault: 11 gtimeout 4s ./main <
input.txt > output.txt [Finished in 1.3s with exit code 139] [cmd:
['g++-11 main.cpp -o main && gtimeout 4s
./main<input.txt>output.txt']]
我检查了所有的索引,看看它是否是数组越界的问题,但我不确定我做错了什么。
请指导
我的完整代码:
#include <bits/stdc++.h>
using namespace std;
struct node{ //TrieNode
char c;
int ends;
string word;
node *child[26];
};
struct node *getNode(char c) //get newnode
{
node *newnode = new node;
newnode->c = c;
newnode->ends = 0;
newnode->word = "";
for(int i=0;i<26;++i)
newnode->child[i] = NULL;
return newnode;
}
node *root = getNode('/'); //root
//Trie INSERT
void insert(string s)
{
node *curr=root;
int index,i=0;
while(s[i])
{
index = s[i]-'a';
if(curr->child[index]==NULL)
curr->child[index] = getNode(s[i]);
curr=curr->child[index];
i+=1;
}
curr->ends += 1;
curr->word = s;
}
void solve(vector<vector<char>>& board,int i,int j,int r,int c,vector<string>& ans,node *curr)
{
//Base case
//If the trie doesn't have the current char OR cell is Visited
int index = board[i][j]-'a';
if(board[i][j]=='$' || curr->child[index]==NULL)
return;
curr = curr->child[index];
if(curr->ends > 0)
{
ans.push_back(curr->word);
curr->ends -=1;
}
//Body
char ch = board[i][j]; //Store current char
board[i][j] = '$'; //Mark current node visited
if(i>0) //TOP
solve(board,i-1,j,r,c,ans,curr);
if(i<r-1) //DOWN
solve(board,i+1,j,r,c,ans,curr);
if(j>0) //LEFT
solve(board,i,j-1,r,c,ans,curr);
if(j<c-1) //RIGHT
solve(board,i,j+1,r,c,ans,curr);
if(i>0 && j>0) //TOP LEFT
solve(board,i-1,j-1,r,c,ans,curr);
if(i<r-1 && j>0) //DOWN LEFT
solve(board,i+1,j-1,r,c,ans,curr);
if(i<r-1 && j<c-1) //DOWN RIGHT
solve(board,i+1,j+1,r,c,ans,curr);
if(i>0 && j<c-1) //TOP RIGHT
solve(board,i-1,j+1,r,c,ans,curr);
board[i][j] = ch; //Mark current node as Unvisited by restoring the value
}
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
int r=board.size();
int c=board[0].size();
//Insert all words in TRIE
for(int i=0;i<words.size();++i)
insert(words[i]);
//Now search words
vector<string> ans;
for(int i=0;i<r;++i)
{
for(int j=0;j<c;++j)
solve(board,i,j,r,c,ans,root);
}
return ans;
}
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;
for (int i = 0; i < o; ++i)
{
cin>>w[i];
}
cin>>p;
for (int i = 0; i < p; ++i)
{
for (int j = 0; j < p; ++j)
{
cin>>x[i][j];
}
}
/*
vector<string> w = {"gitohro", "qf", "ejvh", "i"};
vector<vector<char>> x = {
{'g','o','r'},
{'p','i','h'},
{'s','t','o'}
};
*/
vector<string> res = findWords(x,w);
for(auto i:res)
cout<<i<<" ";
return 0;
}
/*
Input 1:
4
gitohro qf ejvh i
3
gor
pih
sto
Output 1:
gitohro i
*/
您的 main()
正在将用户输入读入空向量。您没有向它们添加任何条目,因此您对 vector::operator[]
的使用会导致 未定义的行为 (如果您将 vector::operator[]
替换为 vector::at()
,你会得到 std::out_of_range
抛出的异常。
当您对输入进行硬编码时,您正在使用实际条目正确填充 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;
w.resize(o); // <-- ADD THIS!
for (int i = 0; i < o; ++i)
{
cin >> w[i];
}
cin >> p;
x.resize(p, vector<char>(p)); // <-- ADD THIS!
for (int i = 0; i < p; ++i)
{
for (int j = 0; j < p; ++j)
{
cin >> x[i][j];
}
}
vector<string> res = findWords(x, w);
for(auto i : res)
cout << i << " ";
return 0;
}
或者:
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int o, p;
cin >> o;
vector<string> w(o); // <-- INIT HERE!
for (int i = 0; i < o; ++i)
{
cin >> w[i];
}
cin >> p;
vector<vector<char>> x(p, vector<char>(p)); // <-- INIT HERE!
for (int i = 0; i < p; ++i)
{
for (int j = 0; j < p; ++j)
{
cin >> x[i][j];
}
}
vector<string> res = findWords(x, w);
for(auto i : res)
cout << i << " ";
return 0;
}
或者,使用 vector::push_back()
而不是 vector::operator[]
:
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;
w.reserve(o);
for (int i = 0; i < o; ++i)
{
string s;
cin >> s;
w.push_back(s);
}
cin >> p;
x.reserve(p);
for (int i = 0; i < p; ++i)
{
vector<char> v;
v.reserve(p);
for (int j = 0; j < p; ++j)
{
char ch;
cin >> ch;
v.push_back(ch);
}
x.push_back(v):
}
vector<string> res = findWords(x, w);
for(auto i : res)
cout << i << " ";
return 0;
}
在发布这个问题之前,我检查了与 Segmentation fault 相关的现有问题,但我无法解决我的错误。
我正在尝试 运行 一个用于以下输入的 C++ 程序,但我遇到了分段错误。
输入:
4
gitohro qf ejvh i
3
gor
pih
sto
预期输出:
gitohro i
当我在我的程序中硬编码输入时,我得到了预期的输出。 但是当我从 user/console 获取输入时,我得到了 Segmentation fault error.
实际错误信息:
/bin/sh: line 1: 22094 Segmentation fault: 11 gtimeout 4s ./main < input.txt > output.txt [Finished in 1.3s with exit code 139] [cmd: ['g++-11 main.cpp -o main && gtimeout 4s ./main<input.txt>output.txt']]
我检查了所有的索引,看看它是否是数组越界的问题,但我不确定我做错了什么。 请指导
我的完整代码:
#include <bits/stdc++.h>
using namespace std;
struct node{ //TrieNode
char c;
int ends;
string word;
node *child[26];
};
struct node *getNode(char c) //get newnode
{
node *newnode = new node;
newnode->c = c;
newnode->ends = 0;
newnode->word = "";
for(int i=0;i<26;++i)
newnode->child[i] = NULL;
return newnode;
}
node *root = getNode('/'); //root
//Trie INSERT
void insert(string s)
{
node *curr=root;
int index,i=0;
while(s[i])
{
index = s[i]-'a';
if(curr->child[index]==NULL)
curr->child[index] = getNode(s[i]);
curr=curr->child[index];
i+=1;
}
curr->ends += 1;
curr->word = s;
}
void solve(vector<vector<char>>& board,int i,int j,int r,int c,vector<string>& ans,node *curr)
{
//Base case
//If the trie doesn't have the current char OR cell is Visited
int index = board[i][j]-'a';
if(board[i][j]=='$' || curr->child[index]==NULL)
return;
curr = curr->child[index];
if(curr->ends > 0)
{
ans.push_back(curr->word);
curr->ends -=1;
}
//Body
char ch = board[i][j]; //Store current char
board[i][j] = '$'; //Mark current node visited
if(i>0) //TOP
solve(board,i-1,j,r,c,ans,curr);
if(i<r-1) //DOWN
solve(board,i+1,j,r,c,ans,curr);
if(j>0) //LEFT
solve(board,i,j-1,r,c,ans,curr);
if(j<c-1) //RIGHT
solve(board,i,j+1,r,c,ans,curr);
if(i>0 && j>0) //TOP LEFT
solve(board,i-1,j-1,r,c,ans,curr);
if(i<r-1 && j>0) //DOWN LEFT
solve(board,i+1,j-1,r,c,ans,curr);
if(i<r-1 && j<c-1) //DOWN RIGHT
solve(board,i+1,j+1,r,c,ans,curr);
if(i>0 && j<c-1) //TOP RIGHT
solve(board,i-1,j+1,r,c,ans,curr);
board[i][j] = ch; //Mark current node as Unvisited by restoring the value
}
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
int r=board.size();
int c=board[0].size();
//Insert all words in TRIE
for(int i=0;i<words.size();++i)
insert(words[i]);
//Now search words
vector<string> ans;
for(int i=0;i<r;++i)
{
for(int j=0;j<c;++j)
solve(board,i,j,r,c,ans,root);
}
return ans;
}
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;
for (int i = 0; i < o; ++i)
{
cin>>w[i];
}
cin>>p;
for (int i = 0; i < p; ++i)
{
for (int j = 0; j < p; ++j)
{
cin>>x[i][j];
}
}
/*
vector<string> w = {"gitohro", "qf", "ejvh", "i"};
vector<vector<char>> x = {
{'g','o','r'},
{'p','i','h'},
{'s','t','o'}
};
*/
vector<string> res = findWords(x,w);
for(auto i:res)
cout<<i<<" ";
return 0;
}
/*
Input 1:
4
gitohro qf ejvh i
3
gor
pih
sto
Output 1:
gitohro i
*/
您的 main()
正在将用户输入读入空向量。您没有向它们添加任何条目,因此您对 vector::operator[]
的使用会导致 未定义的行为 (如果您将 vector::operator[]
替换为 vector::at()
,你会得到 std::out_of_range
抛出的异常。
当您对输入进行硬编码时,您正在使用实际条目正确填充 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;
w.resize(o); // <-- ADD THIS!
for (int i = 0; i < o; ++i)
{
cin >> w[i];
}
cin >> p;
x.resize(p, vector<char>(p)); // <-- ADD THIS!
for (int i = 0; i < p; ++i)
{
for (int j = 0; j < p; ++j)
{
cin >> x[i][j];
}
}
vector<string> res = findWords(x, w);
for(auto i : res)
cout << i << " ";
return 0;
}
或者:
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int o, p;
cin >> o;
vector<string> w(o); // <-- INIT HERE!
for (int i = 0; i < o; ++i)
{
cin >> w[i];
}
cin >> p;
vector<vector<char>> x(p, vector<char>(p)); // <-- INIT HERE!
for (int i = 0; i < p; ++i)
{
for (int j = 0; j < p; ++j)
{
cin >> x[i][j];
}
}
vector<string> res = findWords(x, w);
for(auto i : res)
cout << i << " ";
return 0;
}
或者,使用 vector::push_back()
而不是 vector::operator[]
:
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;
w.reserve(o);
for (int i = 0; i < o; ++i)
{
string s;
cin >> s;
w.push_back(s);
}
cin >> p;
x.reserve(p);
for (int i = 0; i < p; ++i)
{
vector<char> v;
v.reserve(p);
for (int j = 0; j < p; ++j)
{
char ch;
cin >> ch;
v.push_back(ch);
}
x.push_back(v):
}
vector<string> res = findWords(x, w);
for(auto i : res)
cout << i << " ";
return 0;
}