如何将字符串类型转换为具有不同大小的char数组成员的结构?

时间:2012-04-03 09:38:08

标签: c string struct

如何将字符串强制转换为具有不同大小的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;

现在我将有一个字符串,将与上述信息和&我只想解析它们各自的信息并将其填充到各自的结构成员中。

2 个答案:

答案 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”。