如何将字符串强制转换为具有不同大小的char数组成员的结构? 例如
typedef struct format{
char test1[12];
char test2[3];
char test3[3];
char test4[3];
char test5[9];
char test6[3];
char test7[3];
char test8[7];
char test9[24];
char test10[3];
char test11[24];
}format;
现在我将有一个字符串,将与上述信息和&我只想解析它们各自的信息并将其填充到各自的结构成员中。
答案 0 :(得分:2)
你的理由是什么?你或许可以逃脱:
如果C :
// s is a null-terminated c string.
format* f = (format*)s;
这就是它的全部内容。
如果C ++ :
// std::string s; // assuming basic_string<char>
// do stuff with s
format* f = reinterpret_cast<format*>(s.c_str());
如果字符串保留在范围内。根据您的STL实施,这可能存在风险。
对于C ++和C :如果您的字符串切片不是零终止,并且您在格式成员上调用标准的C风格字符串函数,则还存在读取每个字符串范围的风险结构
正如undur_gongor和glglgl指出的那样,如果struct中的char数组的对齐和填充导致非紧密打包的结构(即,由于对齐规则而存在额外的填充),这可能不起作用。
正如史蒂夫指出的那样,在大多数所有架构中,char
是1个字节,这意味着你应该是安全的。
答案 1 :(得分:0)
在C中,没有什么可以阻止你将这个结构转换为char *并将其视为字符串。
然而,尽管如此,你将不得不小心如何对待这个“字符串”。请考虑以下示例:typedef struct format{
char R[12];
char M[15];
} format;
void main(){
format A;
int i;
strcpy(A.R,"AA");
strcpy(A.M,"AABBCC");
char *B=(char*)&A; //Note the typecasting
printf("%s",B);
for (i=0;i<strlen(B);i++){
printf("%d\n",*(B+i));
}
}
上面的示例不会按预期工作,即它不会迭代A中的所有字符,因为C中的字符串为空终止(http://en.wikipedia.org/wiki/Null-terminated_string这就是各种函数(strlen,strcpy和其他函数)知道它们已经到达字符流的末尾的方式。因此,上面的代码将输出“AA”和[65,65](这是“A”的asci)。
要使上面的代码完成预期的操作,我们必须这样做:
1)删除所有“\ 0”(空)字符,除了最后一个字符,然后将其作为字符串处理(并将其提供给其他函数,例如printf)
2)或者,如果我们想要将所有单个字段维护为字符串并仍然解析它,我们现在必须在“for”中使用sizeof(格式)(或sizeof(A))而不是strlen(B)迭代上面。
所以,是的,您可以将一个字符结构类型转换为(char *)并将其视为一个字符串,但是您需要进行一些预处理才能使其按预期工作。例如,您可以使用一个函数来实现删除“\ 0”,如上面的(1)所示,称为“structToString”。