2011-03-10 329 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; 
}