2012-08-29 78 views
3

結構元素我有這樣的結構:指定字符串在C

typedef struct SM_DB 
{ 
    LIST_TYPE   link; 
    char    name[SM_NAME_SIZE]; 
} SM_DB_TYPE; 

而且我想將一個字符串分配給它的「名字」。我這樣做是這樣的:

SM_DB_TYPE one; 
one.name = "Alpha"; 

然而,編譯後,我得到一個錯誤:「錯誤C2106:‘=’:左操作數必須是左值」。我希望這是相當明顯的。有誰知道我做錯了什麼?

感謝

+0

您不能將字符串分配給char數組。 – squiguy

+0

您可以但必須全部同時使用,即'char name [SM_NAME_SIZE] =「Alpha」;' – RPGillespie

回答

4

假設SM_NAME_SIZE夠大,你可以只使用strcpy像這樣:

strcpy(one.name, "Alpha");

只要確保你的目的地有足夠的空間做的strcpy你,你會得到一個緩衝區溢出之前舉行的字符串。

如果你想發揮它的安全,你可以做

if(!(one.name = malloc(strlen("Alpha") + 1))) //+1 is to make room for the NULL char that terminates C strings 
{ 
     //allocation failed 
} 
strcpy(one.name, "Alpha"); //note that '\0' is not included with Alpha, it is handled by strcpy 
//do whatever with one.name 
free(one.name) //release space previously allocated 

確保您免費one.name如果使用malloc,這樣你就不會浪費內存。

+0

據我所知,我們不能將內存分配給數組。這不正確嗎?但你的答案仍然給我一種方式。 – barnes

2

使用strcpystrncpy指定字符串C.

+0

或者如果您可以使用它們,strcpy_s或strncpy_s。 – Glenn

+1

或者,如果您知道源字符串的長度,請使用'memmove()'或'memcpy()' - 並且如果您不知道源字符串的長度,如何知道可以安全地複製串入目標。 –

5

你只能同時宣佈其分配值的字符串。您以後不能使用=進行分配。

您必須使用strcpy()函數。

0

用途:

strcpy(one.name, "Alpha"); //Removed null byte (Read first comment by shf301) 

備選:

typedef struct SM_DB 
{ 
    LIST_TYPE   link; 
    char*    name; 
} SM_DB_TYPE; 

SM_DB_TYPE one; 
one.name = malloc(sizeof(char) * (strlen("Alpha") + 1); //Allocate memory 
if (!one.name) { 
    /* Error handling */ 
} else { 
    strcpy(one.name, "Alpha"); 
} 
+0

您不需要'\ 0'。字符串常量在末尾隱式地具有零零。 「Alpha \ 0」創建一個帶有兩個尾隨空零的字符串。 – shf301

+0

你不覺得'sizeof(char)'有點多餘,因爲'char'只有一個字節嗎?除非我錯誤地想到這不是說'malloc(1 * strlen(「Alpha \ 0」))'? –

+0

@KeithMiller只是增加了可讀性(尤其是考慮到讀者可以根據他們的專業知識而顯着變化) – check123

1

C沒有內置的字符串類型。您必須使用一組字符來保存字符串。

因爲C也不允許將一個數組賦值給另一個數組,所以必須使用標準C庫中的各種函數將數組元素從一個數組複製到另一個數組,或者您必須編寫一個循環來自己完成。儘管有時候有理由編寫自己的循環,但使用標準C庫函數更受歡迎。

爲了與char類型中使用的標準ANSI類型字符串存在大量的功能其中大部分與STR開始諸如函數來複制或比較字符串strcpy()strcmp()。還有另一組您指定要複製或比較的最大字符數,例如strncpy()strncmp()

C中的字符串是一個由二進制零字符終止的字符數組。因此,如果您使用常量字符串(例如「常量」),則會創建一個字符數組,每個字符只有一個元素,另外還有一個用於零終止符的元素。

這意味着當調整字符數組的大小時,還必須記得添加一個額外的數組元素來保存零終止符。

strncpy()函數會將一個字符數組複製到另一個字符數組,直到指定的最大字符數或找到零終止符時爲止。如果達到最大字符數,則目標數組不會被零終止符終止,所以這是需要注意的。

char one[10]; 
char two[20]; 
strncpy (one, "1234567", 10); // copy constant to the char buffer max of 10 chars 
one[9] = 0; // make sure the string is zero terminated, it will be this is demo 
strcpy (two, one); 
strcat (two, " suffix"); // add some more text to the end 

還有一些函數可以與UNICODE一起使用的寬字符。