C++ 更改字符串中的字符

C++ change char in string

提问人:Bele 提问时间:8/8/2023 最后编辑:Vlad from MoscowBele 更新时间:8/8/2023 访问量:106

问:

如果我想更改字符串中的单个字符,我可以这样做:

#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[]) 是指向其第一个索引的指针。这是否也适用于字符串?我该如何解决?

C++ 字符串 指针 下标运算符

评论

5赞 drescherjm 8/8/2023
在 c++ 中,我们更喜欢通过引用传递而不是通过指针传递。我会写而不是void changeStr(string & mystring)void changeStr(string* mystring)
3赞 john 8/8/2023
在你的函数中,你有一个指向字符串的指针,而不是一个字符串,所以你应该改变你的代码来取消引用指针。或者,像上面的评论一样,你可以将函数更改为使用引用。(*mystring)[0] = 'T';
1赞 john 8/8/2023
我知道 char 数组 (char[]) 是指向其第一个索引的指针。这是否也适用于字符串?不,它不是,a 是一个对象,而不是数组或指针。std::string
0赞 Bele 8/8/2023
好的,谢谢。这对我来说是一个大问题。我不确定何时通过引用或指针传递,并且并不真正理解其中的区别。
0赞 Drew Dormann 8/8/2023
错字。的第一个字符是 或 。您正在分配给整个字符串string* mystringmystring[0][0](*mystring)[0]'T'

答:

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 的指针类型是等效的。因此,在函数中,您甚至可以编写*mystringmystring[0]mystringstd::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';
}