为什么 string.length()=0 在使用 string[i] 处理字符串后
Why is string.length()=0 after processing string using string[i]?
我在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; 应该工作。
s2[j]=s1[i];
s2
最初为空。访问s2[j]
是越界和未定义的行为。
将其更改为s2+=s1[i]
,一切都很好。
仅供参考,在 mordern 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';
}
默认构造字符串的长度为 0。
s2[j]
访问索引j
处的字符。如果该字符不存在,则程序的行为是未定义的。
当字符串的长度为 0 时,对于任何大于 0 的j
,s2[j]
具有未定义的行为,因为该字符不存在。 s2[0]
定义良好,并引用空终止符。
您可能打算向字符串添加字符。例如,可以使用 push_back
成员函数或+=
运算符向字符串添加字符。
不能使用 [] 增加 s2 字符串大小。如果您事先使用调整大小来增加它,它应该可以工作:
s2.resize(j+1);
s2[j]=s1[i];
j++;
std::string 上的字符的 push_back() 也会做同样的事情。但是,我为您提供此答案,因为它保留了您已经拥有的角色分配。最小答案/更改的哲学:-)。
#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如上所示
相关文章:
- 迭代和比较映射<字符串、矢量<string>> c++ 中的值
- 将向量解析<string>为字符串
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 两个数组,int 和 string,如何显示带有对应 int 的字符串?
- 将图形表示为unordered_map<字符串、向量>时拓扑排序错误<string>
- 将 std::string( "x3BxDEx7C" ) 转换为可读的十六进制字符串?
- 为什么 string::begin() 在即时窗口中输出整个字符串
- 比较 std::string 和 C 样式字符串文字
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 将 c 字符串直接写入 std::string
- std::hash<std::string> 可以为不同的字符串返回相同的值吗?
- 反转没有循环的字符串,C++中只有 std::string 成员
- 为什么我不必从 std::string 的函数中释放字符串c_str?
- 如何将矢量元素复制到<string>字符串中?
- 为什么<string>字符串对象需要 #include 而不是字符串文本?
- 在哪里使用 c++(即 std::string) 字符串以及在哪里使用'