要C++结构的字符串
string to struct in C++
我有一个字符串变量
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
(尤其是不要写入它(并假设您可能会找到的内容。
相关文章:
- C++结构到字符串
- 从字符串中获取结构的大小
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 如何解析表示树状数据结构的字符串
- 如何将字符串与结构(也包括字符串)进行比较?
- 如果结构中的字符串比使用的 p/调用签名长或短,会发生什么情况?
- 在向量 C++14(无限制联合)的结构内的联合中创建和存储字符串
- C++ - 使用用户输入的字符串数据检查结构字符串数据(无限执行 while 循环)
- 将字符串存储在 constexpr 结构中
- 为什么我的结构在包含字符串时崩溃?
- 如何将字符串字符与结构数组进行比较?
- 无法使用 strcpy 将字符串复制到静态结构成员
- c++ 将函数参数(带有模板变量的结构)转换为函数体内的字符串
- 在 c++ 中使用字符串变量选择静态类结构,而不带对象
- C++使用旧编译器GCC 4.4.0在结构列表中查找字符串
- 具有字符串成员的结构的动态数组
- 如何将文本文件保存到C 中的字符串结构
- C++ 斯特劳斯特鲁普的"std_lib_facilities.h"字符串结构 – 警告:无符号表达式的比较
- C++:字符串结构相等
- 返回字符串结构是否安全