分段错误通过std字符串循环遍历

时间:2014-03-28 05:15:15

标签: c++ string for-loop char

我正在尝试创建一个程序,要求我逐个字符循环字符串并对其进行说明。这就是我现在所拥有的:

#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)错误。任何人都可以帮助我理解为什么我收到此错误?我已经尝试了一切!

编辑:更新以更具体地说明该计划正在做什么!

2 个答案:

答案 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();
}