C++ 指向字符串数据类型的指针
具有如下简单代码:C++ 指向字符串数据类型的指针,c++,winapi,C++,Winapi,具有如下简单代码: using namespace std; ... string str = "Abc"; string* str_ptr = &str; str_ptr[0] = 'D'; sprintf_s(MsgBuff, 300, "%s", str_ptr); OutputDebugStringA(MsgBuff); 输出只是D,不是我期望的Dbc 使用C样式字符串执行类似操作: char str[] = "Abc&quo
using namespace std;
...
string str = "Abc";
string* str_ptr = &str;
str_ptr[0] = 'D';
sprintf_s(MsgBuff, 300, "%s", str_ptr);
OutputDebugStringA(MsgBuff);
输出只是D,不是我期望的Dbc
使用C样式字符串执行类似操作:
char str[] = "Abc";
char* str_ptr = str;
str_ptr[0] = 'D';
Indead返回Dbc。%s在sprintfs格式的字符串中需要一个C样式的字符串,而不需要其他字符串。因此,您的代码应该类似于:
string str = "Abc";
char *char_ptr = str.data ();
char_ptr[0] = 'D';
sprintf_s(MsgBuff, 300, "%s", char_ptr);
OutputDebugStringA(MsgBuff);
字符串str=Abc;
字符串*str_ptr=&str;
str_ptr[0]=“D”;
与
字符串str=Abc;
字符串*str_ptr=&str;
*str_ptr='D';
与
字符串str=Abc;
str='D';
string有一个重载运算符=用于分配char值,这就是为什么字符串变为D而不是Dbc
然而,sprintf_sMsgBuff,300,%s,str_ptr;是未定义的行为,因为%s需要指向以null结尾的C字符串的char*指针,而str_ptr不是
因此,在本例中,如果编译器的std::string类实现了短字符串优化,并且它的SSO缓冲区是类中的第一个数据成员,则str_ptr在被误解为char*时,可能会生成一个可行的以null结尾的C字符串。这两个都是在编写符合标准的代码时不能依赖的实现细节。首先,字符串类型的指针与char类型的指针不同。您可以参考以下代码
#include <iostream>
using namespace std;
int main(int argc, const char* argv[])
{
string* s = new string("Abc");
cout << s << endl;
cout << *s << endl;
return 0;
}
该字符串与C语言中的字符类型字符串不同。字符串指针指向类对象。如果要通过字符串指针修改字符串的内容,可以尝试以下代码:
string* str_ptr = &str;
str_ptr->at(0) = 'D';
您不能直接使用str_ptr作为%s的参数,它应该是str_ptr->c_str
以下是完整的示例:
#include <iostream>
#include <windows.h>
#include <WinUser.h>
using namespace std;
int main(int argc, const char* argv[])
{
string str = "Abc";
string* str_ptr = &str;
str_ptr->at(0) = 'D';
char MsgBuff[300];
sprintf_s(MsgBuff, 300, "\nMSG = %s\n", str_ptr->c_str());
OutputDebugStringA(MsgBuff);
return 0;
}
这对我很有用:
这是怎么回事?编译器应该说你不能将字符串转换为字符串*.这是一个STD::string或其他东西吗?@ SytRelnnIja是的,这是标准的C++字符串数据类型,从STD.@ APLET123,对不起,我的错误,现在被纠正了。StryPtR(0)是一个STD::String:不是Car and ok,它是有效的,但是,当我想使用字符串数据类型指针string*str_ptr=&str时,该怎么办呢。但是,您可以执行str[0]='D';因此,使用string*str_ptr=&str我们只是创建一个指向string类an的指针,与C风格的poiner char str[]=Abc完全不同;char*str_ptr=str;到char是?@Derek81:第一个是指向std::string的指针。第二个可能是指向char[]的指针,但由于C语言中的一些怪癖,char[]有时会伪装成char*,因此str_ptr最终是指向这些字符的指针,而不是像您预期的那样指向C字符串的指针。行为怪异的不是std::string,而是char[]行为怪异。
#include <iostream>
#include <windows.h>
#include <WinUser.h>
using namespace std;
int main(int argc, const char* argv[])
{
string str = "Abc";
string* str_ptr = &str;
str_ptr->at(0) = 'D';
char MsgBuff[300];
sprintf_s(MsgBuff, 300, "\nMSG = %s\n", str_ptr->c_str());
OutputDebugStringA(MsgBuff);
return 0;
}