我用C ++编写了一个程序,以一个句子作为输入,并希望在省略空格后显示该句子,但是我得到了奇怪的结果... s2是包含空格后的句子的字符串。 我可以将字符串s2作为s2 [i]访问,但是当我尝试cout << s2时却没有输出。并且s2.length()的值显示为0 ??
#include<iostream>
using namespace std;
int main()
{
string s1,s2;
int i,j,l1,l2;
getline(cin,s1);
l1=s1.length();
j=0;
for(i=0;i<l1;i++)
{
if(s1[i]!=' ')
{
s2[j]=s1[i];
j++;
}
}
cout<<s2.length();
cout<<s2<<endl;
}
预期:s2.length()不应为0并且cout << s2;应该管用。
答案 0 :(得分:3)
s2[j]=s1[i];
s2
最初是空的。访问s2[j]
超出范围并且行为未定义。
将其更改为s2+=s1[i]
,一切都很好。
更新仅供参考,在现代C ++中,您通常不需要处理长度,因为您应该更喜欢使用标准库算法:
#include<iostream>
#include<string>
#include<algorithm>
int main()
{
std::string s1,s2;
getline(std::cin,s1);
std::copy_if(s1.begin(), s1.end(), std::back_inserter(s2), [](char ch){
return ch!=' ';
});
std::cout<<s2.length();
std::cout<<s2<<'\n';
}
答案 1 :(得分:2)
默认构造的字符串的长度为0。
s2[j]
访问索引j
处的字符。如果该字符不存在,则程序的行为是不确定的。
当字符串的长度为0时,对于任何大于0的j
,s2[j]
都具有不确定的行为,因为该字符不存在。 s2[0]
定义明确,指的是空终止符。
您可能打算在字符串中添加字符。例如,您可以使用push_back
成员函数或+=
运算符将字符添加到字符串中。
答案 2 :(得分:0)
您不能使用[]来增加s2字符串的大小。如果您使用调整大小来预先增加它,它应该可以工作:
s2.resize(j+1);
s2[j]=s1[i];
j++;
在std :: string上字符的push_back()会做同样的事情。但是,我会为您提供此答案,因为它会保留您已有的字符分配。最小的回答/改变的哲学:-)。
答案 3 :(得分:-1)
#include<iostream>
using namespace std;
int main()
{
string s1,s2;
int i,l1;
getline(cin,s1);
l1=s1.length();
for(i=0;i<l1;i++)
{
if(s1[i]!=' ')
{
s2.push_back(s1[i]); //CHANGE MADE HERE
}
}
cout<<s2.length();
cout<<s2<<endl;
}
如@iBug所述,您也可以使用上图所示的push_back