为什么我会收到分段错误?将输出作为数字而不是字符串的原因是什么?

时间:2016-12-24 15:03:02

标签: c++ string c++11 vector

我知道为什么会出现分段错误,但是我无法通过以下代码找出错误,我根据空格分割了一个字符串。

#include<iostream>
#include<string>
#include<vector>
#include<typeinfo>
using namespace std;
vector<string> split(const string& s)
{
    //cout << "HERE";
    vector<string> tab;
    for(unsigned int a = 0; a < s.size(); a++)
    {
        string temp = to_string(s[a]);
        while(to_string(s[a]) != " ")
        {
            a++;
            temp = temp + s[a];
        }
        tab.push_back(temp);
    }
    return tab;
}   


int main()
{
    int n;
    cin >> n;

    while(n--)
    {
        string s;
        cin >> s;
        vector<string> temp = split(s);
        for(unsigned int i = 0; i < temp.size(); i++)
        {
            cout << temp[i] << endl;
        }
    }
    return 0;
}

另外,如果我在split函数中注释掉while循环,我会在打印出结果字符串时得到数字。是因为to_string吗?如果我在主函数中打印时得到的结果字符串使用typeid(variable).name(),我会得到:NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

2 个答案:

答案 0 :(得分:3)

回答你的最后一个问题:

C ++经常(但不总是)将char值视为数字,如果将其传递给to_string,则肯定会这样做。因此to_string(' ')将返回"32"(通常),这是转换为十进制字符串的空格的字符代码。

要将字符转换为相应的单元素字符串,请使用例如string(1, ' ')

对于您的分段错误,调试器是正确的工具。

答案 1 :(得分:0)

您的分割功能有问题。您的程序将始终崩溃,因为while循环上的while(to_string(s[a]) != " ")条件将导致无限循环。

对我来说,使用to_string(s [a])似乎很奇怪。让我们说s [a]实际上是空格char,即使在这种情况下toString(&#34;&#34;)将返回一个std :: string,其中包含&#34; 32&#34;。并且&#34; 32&#34;是不平等的#34; &#34;所以这会导致你的循环无限运行。

因为在循环中你正在增加索引,如下所示。

    a++;  ---> You increase the index in infite loop so a can go to millions 
    temp = temp + s[a]; ---> you are using the index and causing index out of range. 

您将导致索引超出范围错误。