我有一个字符串a =" Hello world!",现在为了好玩,我希望将字符串a中的第一个字母更改为我选择的数字。例如
string a = "Hello world!";
int x;
std:cin>>x;
a[0] = x;
cout << a;
现在我想要它生产的是&#34; xello世界!&#34; x是我输入的数字,但我得到一个笑脸。
有人看过类似的东西,知道如何解决它吗?
另外:为什么你甚至可以访问像这个字符串[]的字符串?它不是一个char数组o.o
答案 0 :(得分:5)
如果x
是一位数字,请改为:
a[0] = x + '0';
修改强>:
为什么会这样做:
string
中的每个元素都是char
。 char
由integer
表示。您可以在ASCII table
中查看此内容。例如,integer 48
代表char '0'
,integer 49
代表char '1'
等。因此,通过将integer x
添加到char '0'
,您可以获得你想要的数字'x'
。
为什么它可能有危险:
我能想到的一个原因是在空字符串中写入未分配的内存时,可能会调用未定义的行为。
然后,您可以使用string::empty()
检查字符串是否为空。在这种情况下,
if (!a.empty()) {...}
答案 1 :(得分:3)
使用string::replace和std::to_string,无论x
是单个还是多个数字,这都会有效:
string a = "Hello world!";
int x;
std:cin>>x;
a.replace(0, 1, std::to_string(x));
答案 2 :(得分:0)
作为一个额外的答案,你可以在try块中使用at()
方法,因为它正在执行边界检查,如果访问无效,则抛出std::out_of_range
类型的异常:
如果您添加x + '0'
且x
高于9,则无法为您提供数字。
请查看ascii table
int main()
{
std::string a { "Hello World" };
int x {};
std::cin >> x;
try {
a.at(0) = '0' + x; // OOPS: '0' + 10 will give you ':'
std::cout << a << '\n';
}
catch(std::out_of_range& e) {
std::cout << e.what();
}
}
更好的解决方案是@PaulMcKenzie回答,使用std::to_string
和string::replace
。