提问人:Bele 提问时间:8/8/2023 最后编辑:Vlad from MoscowBele 更新时间:8/8/2023 访问量:106
C++ 更改字符串中的字符
C++ change char in string
问:
如果我想更改字符串中的单个字符,我可以这样做:
#include <iostream>
#include <string>
using namespace std;
int main() {
string mystring = "Hello";
mystring[0] = 'T';
cout << mystring;
return 0;
}
如果我想使用不同的函数更改字符串中的单个字符:
#include <iostream>
#include <string>
using namespace std;
void changeStr(string* mystring);
int main() {
string mystring = "Hello";
changeStr(&mystring);
cout << mystring;
return 0;
}
void changeStr(string* mystring)
{
mystring[0] = 'T';
}
为什么它不起作用?整个字符串更改为“T”。我是编程新手,在指针/地址方面仍然遇到一些问题。我知道 char 数组 (char[]) 是指向其第一个索引的指针。这是否也适用于字符串?我该如何解决?
答:
1赞
Vlad from Moscow
8/8/2023
#1
对于初学者来说,通过指向对象的指针将该类型的对象传递给函数是没有意义的。您可以通过引用来传递它。所以函数可能看起来像std::string
void changeStr(string &mystring)
{
mystring[0] = 'T';
}
相应地,该函数的调用方式如下
changeStr(mystring);
至于你的问题,那么首先你需要取消引用指针,然后才应用下标运算符
void changeStr(string* mystring)
{
( *mystring )[0] = 'T';
}
或者,你可以写
void changeStr(string* mystring)
{
mystring->operator []( 0 ) = 'T';
}
请注意,后缀下标运算符的优先级高于取消引用运算符。
至于你的演示程序中的语句在函数中
mystring[0] = 'T';
然后实际上它使用赋值运算符将字符分配给字符串'T'
basic_string& operator=(charT c);
而不是只分配字符串的第一个字符。
也就是说,在此语句之后,字符串将等于 。"T"
如果写进去也是一样的main
mystring = 'T';
表达式和 where 的指针类型是等效的。因此,在函数中,您甚至可以编写*mystring
mystring[0]
mystring
std::string *
mystring[0][0] = 'T';
而不是
( *mystring )[0] = 'T';
尽管正如我之前指出的那样,通过引用传递字符串要好得多。
评论
0赞
Bele
8/8/2023
感谢您的快速回答。我尝试了不带括号的“( *mystring )[0] = 'T';”,并出现了编译器错误。为什么需要这样做才能工作?它改变了什么?
0赞
Vlad from Moscow
8/8/2023
@Bele 下标运算符的优先级高于取消引用运算符,但首先需要应用取消引用运算符。
0赞
user18476992
8/8/2023
#2
您不需要传递指针。只需通过引用传递它(引用将更新值),如果您通过指针传递它,则返回字符串而不是 void。 更好的选择..通过引用传递它
#include <iostream>
#include<string>
using namespace std;
void changeStr(string &mystring);
int main() {
string mystring = "Hello";
changeStr(mystring);
cout << mystring;
return 0;
}
void changeStr(string &mystring)
{
mystring[0] = 'T';
}
评论
void changeStr(string & mystring)
void changeStr(string* mystring)
(*mystring)[0] = 'T';
std::string
string* mystring
mystring[0][0]
(*mystring)[0]
'T'