c ++中的运行时错误。重定位协议版本%d

时间:2016-12-09 05:43:05

标签: c++ stack protocols relocation

请帮助我解决转换spoj here is the link表达式的问题。它给出了运行时错误。

     #include <iostream>
     #include <stack>
#include <string>
using namespace std;
int main()
{
    int testcases;
    cin >> testcases;
    while(testcases-->0)
    {
        string s;
        cin >> s;
        cout << s;
        stack<string> st;
        for(int i=0;i<s.length();i++)
        {
            if(s.at(i)=='(')
                continue;
            else
                if(s.at(i)==')')
                {
                    string s2=st.top();
                    st.pop();
                    string expression=st.top();
                    st.pop();
                    string s1=st.top();
                    st.pop();
                    string tba=s1+s2+expression+"";
                    st.push(tba);
                    cout << tba << endl ;
                    }
            else
                st.push(s.at(i)+"");
                }

        string ss=st.top();
        cout << ss;
        }

    }

错误的来临是不可理解的。 以下是第一行和第二行输入的错误。

1
(a+(b*c))
(a+(b*c))do relocation protocol version %d.
o relocation protocol version %d.
uery failed for %d bytes at address %p
udo relocation protocol version %d.
do relocation protocol version %d.
o relocation protocol version %d.
uery failed for %d bytes at address %pery failed for %d bytes at address %p
udo relocation protocol version %d.
do relocation protocol version %d.
o relocation protocol version %d.
uery failed for %d bytes at address %pery failed for %d bytes at address %p

1 个答案:

答案 0 :(得分:3)

看起来你已成为Java主义的受害者。

char ch = 'a';
string str = value + "";

不会使string str&#34; a&#34;。

这是因为""不是string。它实际上是一个指向常量字符数组的指针,const char *,因为它是一个指针,所以会发生指针运算。

""在记忆中占有一席之地。假设地址10000. 'a'具有数值。让我们坚持使用ASCII并使用97. value + "";告诉编译器去地址10000 + 97,没人知道它会在地址10097找到什么。但它是const char *,并且string有一个构造函数,它将使用const char *并尝试将其转换为string。无论在10097处发生什么,都将用于制作string。这可能导致程序崩溃。它也可以从字符串文字的土地上抓取垃圾,这看起来就是OP发生的事情。

解决方案:

构建string

string str(1, ch);

或在OP的情况下,

st.push(string(1, s.at(i)));

Documentation on string constructor参见构造函数2。

但请注意。你有很多其他逻辑错误best resolved by using the debugging software几乎肯定会伴随你的开发环境。