要C++结构的字符串

string to struct in C++

本文关键字:字符串 结构 C++      更新时间:2023-10-16

我有一个字符串变量

string pr00("")

我想调用该方法 fun1

fun1(demo *dm)

演示定义如下

typedef struct 
{
char pr00[100];
}demo;

将此方法称为

fun1((demo*)pr00);

谢谢和BR

不,这是不安全的。因为std::string的成员和demo不一样。

但是,您可以定义一个构造函数来隐式std::string转换为demo类型。

#define MAX_SIZE    100
struct demo 
{    
demo(const std::string& str)
{
memset(pr00, 0, MAX_SIZE);
if (str.length() < MAX_SIZE)
{
strncpy(pr00, str.c_str(), str.length());
pr00[str.length()] = 0;
}
}
char pr00[MAX_SIZE];
};

现在,您可以按如下方式编写代码:

std::string name("hello world");
demo d(name);

不,fun1((demo*)pr00);是未定义的行为。您需要将(最多 100 个(字符从pr00复制到demo中,并将指向该字符的指针传递给fun1

demo dm;
std::copy_n(pr00.data(), std::min(100, pr00.size()), dm.pr00);
fun1(&dm);

我假设string的意思是std::string.

它不仅不安全,而且无效。这个问题已经fun1((demo*)pr00).

这是将结构强制转换为指针的尝试。非法,如果您的编译器具有允许的设置,请将其关闭。

关于fun1((demo*)&pr00)有一个稍微有趣的问题. 请注意&采用pr00的地址。

它仍然是未定义的行为,但至少它在不相关的结构之间转换指针。

您可以定义void fun2(char*cp)并调用fun2((char*)&pr00)尽管您可以安全地使用fun2()内部的cp执行的操作有许多限制。

您不应该对std::string的布局做出任何假设,因此您应该访问cp(尤其是不要写入它(并假设您可能会找到的内容。