2011-03-10 170 views
0

我在初始化每个代码中的结构时遇到了困难。这甚至可以完成,或者我真的需要memcpy(urg)5个字符的字符串到结构中吗?结构初始化失败

struct MyStruct 
{ 
    char x[5]; 
}; 

main(...) 
{ 
    const char* MyString = {"mnopq"}; // I understand this is a non-NULL terminated string - 
            // it's OK, I just want five character fields in an array 

struct MyStruct = {MyString};  // <---This gives warnings below 
} 

警告:缺少初始化左右括号
警告:初始化将指针整数,未投

如果我换初始化,如:

struct MyStruct = {{MyString}}; 

第一次警告消失。第二个警告没有。并且,因此,该结构不是按照希望初始化的。

在此先感谢您的帮助。

+0

糟糕...它是const char * MyString =“mnopq”; (没有大括号) – user654077 2011-03-10 18:28:26

+0

@ user654077:对不起,但你的问题和你的评论相互矛盾。如果它应该是'const char * MyString =“mnopq”',那么它*是一个以空字符结尾的字符串。然而,在代码评论中你说它不是。 ???决定你想要什么并编辑你的问题。在这个时候它是一团糟。 – AnT 2011-03-10 18:37:39

回答

3

您正试图用指针填充char数组。 MyString被看作是一个const char *而不是一个数组。将结构中的类型更改为const char * x,它应该做到这一点。另外,MyString实际上是一个NULL终止的字符串。编译器将其设置到内存中,并在末尾添加额外的NULL字节,然后将MyString视为一个const char *。

如果你想要的字符X [5],而不是为const char *,你可以在一对夫妇的方式初始化,

struct MyStruct ms = {{'m', 'n', 'o', 'p', 'q'}}; 

,或者你可以做

struct MyStruct ms = {{ MyString[0], MyString[1], MyString[2], MyString[3], MyString[4]}}; 

第一一组花括号用于初始化结构成员,第二组用于初始化char数组成员,因此每个成员(char)都必须单独设置。

+0

我编辑上面有一个标识符。还有一件事是,MyString [index]版本会在最后打印垃圾,而第一个版本不会(例如mnopq | ah |) – Rob 2011-03-10 19:51:14

+0

正确,因为没有NULL终止符。但是在第一个例子结束时不应该有NULL ......我认为他没有提到使用定义的打印函数将字符串打印出来。 – DavidMFrey 2011-03-10 21:29:22

4

"mnopq"是一个数组,const char * MyString不是。

struct MyStruct foo = {"abcde"};会的工作,而你的方法的指针MyString转换成积分值,并将其分配到的x的第一要素。

0

您需要声明MyStruct类型的变量并将它的x值赋值给该字符串。 这应该工作:

struct MyStruct { 
char x[5]; 
}; 

int main(int argc, char *argv[]) { 

    struct MyStruct a; 
    const char* MyString = "mnop"; 

    strncpy((a.x), MyString, 5); 

    /* 
    *if within the 5 characters you do not have the null char it will 
    * also print garbage 
    */ 
    printf("%s", a.x); 

    return 0; 
} 

但是你不能一个指针为const char指定一个字符数组,因为它们是不同的类型。所以您需要在结构中使用char *或使用memcpy/strcpy来获取信息。

0

DavidMFrey的答案是正确的,应该得到我的信贷!然而,这里的源代码使用他的答案,因为我能够运行它:

#include <stdio.h> 
struct MyStruct 
{ 
    char x[5]; 
}; 
int main(void) 
{ 
    const char* MyString = "mnopq"; 
    struct MyStruct foo = {{ MyString[0], MyString[1], MyString[2], MyString[3], MyString[4]}}; 
    printf("foo.x is: %s\n", foo.x); // outputs: foo.x is: mnopq¦ah¦" 

    struct MyStruct ms = {{'m', 'n', 'o', 'p', 'q'}}; 
    printf("ms.x is: %s\n", ms.x); // ms.x is: mnopq 

    return 0; 
}