我声明了2个字符串类型的字符串,qhich是s,s1。我使用s字符串&#c; cin' 我在s1中粘贴3个值。然后我用' cout'但它不能打印字符串。
这是我的代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
string s,s1;
cin>>s;
s1[0]=s[1];
s1[1]=s[2];
s1[2]=s[3];
s1[3]='\0';
cout<<s1<<endl;
return 0;
}
s1不是空的...... cout<<s1[0]<<s1[1]<<s1[2]
并且看到了。
为什么s1不能打印?
答案 0 :(得分:1)
可能,完成OP任务的最简单方法是使用像substr()这样的库函数来处理已发布代码丢失的所有细节(并已经指出):
内存管理。第二个字符串s1
为空,因此尝试编写其前四个(未分配的)元素是未定义的行为。通常,s1
应调整为所需的长度。
null终止符。 std::string
可以管理它的内部表示,并始终通过其成员函数c_str和data(从C ++ 11开始)返回以null结尾的字符串。
如何做到这一点:
#include <iostream>
#include <string>
int main()
{
std::string s;
std::cin >> s;
std::string s1;
std::string::size_type start_pos = 1,
count = 3;
if ( s.size() > start_pos )
s1 = s.substr(start_pos, count);
std::cout << s1 << '\n';
}
答案 1 :(得分:0)
s1
没有任何字符。您正在尝试更改不存在的字符的值。
你的程序有不确定的行为,可能很容易打开骆驼动物园,扭转地球磁场的极性,或解决浴缸中的冷聚变。
s1
的大小正确; '\0'
到最后;这不是C字符串;这是不必要的。 C ++字符串照顾自己。以下是一个例子:
#include <iostream>
#include <cassert>
int main()
{
std::string s, s1;
std::cin >> s;
assert(s.size() >= 4);
s1.resize(3);
s1[0] = s[1];
s1[1] = s[2];
s1[2] = s[3];
std::cout << s1 << std::endl;
}
答案 2 :(得分:0)
您不能指定为s1 [0] = s [1]
正确的方法是使用assign函数:
string s,s1;
cin>>s;
s1.assign(s.begin()+1,s.begin()+4);
cout<<s1<<endl;
答案 3 :(得分:0)
通过在不修复或定义字符串大小的情况下分配索引,无法完成字符串分配。它可能会导致字符串下标错误。如果你想这样做,我认为字符串连接是最好的方法;也就是说,通过在字符串中添加子串或字符串索引。我在下面给出了一些使用字符串连接方法的代码。
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main()
{
string s,s1="";
cin>>s;
s1= s1 + s[1];
s1= s1 + s[2];
s1= s1 + s[3];
cout<<s1<<endl;
return 0;
}