我正在尝试创建一个程序,要求我逐个字符循环字符串并对其进行说明。这就是我现在所拥有的:
#include <iostream>
#include <stack>
#include <string>
int loopThroughString(const string& hello);
int main(void){
while (true) {
cout << "String? " ;
string s;
cin.ignore();
getline(cin, s);
if (s.length() == 0){
break;
}
int answer = loopThroughString(s);
cout << answer << endl;
}
cout << endl;
}
int loopThroughString(const string& hello){
int answer;
string str = hello;
char ch;
stack<int> s1;
for(unsigned int i = 0; i <str.size(); i++){
ch = str[i];
cout << "character ch of hello is: " << ch << "\n";
for(int j=0; j < 10; j++){
if(ch == j)
s1.push(ch);
}
}
result = s1.top();
return result;
}
我在程序的主程序中设置字符串hello,然后调用loopThroughString。
问题是,每次运行程序时,我都会在尝试将char ch设置为等于字符串的最后一个字符时出现Segmentation fault(core dumped)错误。任何人都可以帮助我理解为什么我收到此错误?我已经尝试了一切!
编辑:更新以更具体地说明该计划正在做什么!
答案 0 :(得分:2)
问题是在空堆栈上调用s1.top()
是未定义的行为。在致电! s1.empty()
之前,您应该先检查s1.top()
。
由于代码:
,堆栈通常是空的for(int j=0; j < 10; j++){
if(ch == j)
s1.push(ch);
}
字符ch
包含字符代码;字符'0'
与整数0
具有不同的代码,等等。对此的一个简单修复是for (char j = '0'; j <= '9'; ++j)
。
但是你可以替换整个循环;例如if ( std::isdigit(ch) ) s1.push(ch);
答案 1 :(得分:1)
您正试图获得空堆栈的顶部。
更改
result = s1.top();
return result;
到
if ( s1.empty() )
{
return -1;
}
else
{
return s1.top();
}