我知道为什么会出现分段错误,但是我无法通过以下代码找出错误,我根据空格分割了一个字符串。
#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
。
答案 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.
您将导致索引超出范围错误。