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;
}