2012-08-29 51 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一起使用的宽字符。