将字符串分配给C中的结构中的元素

时间:2012-08-29 14:07:16

标签: c string structure

我有这个结构:

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

我想为其'name'分配一个字符串。我是这样做的:

SM_DB_TYPE one;
one.name = "Alpha";

但是,编译后我得到一个错误:“错误C2106:'=':左操作数必须是l值”。我希望这是相当明显的。有谁知道我做错了什么?

由于

5 个答案:

答案 0 :(得分:5)

您可以在声明字符串时仅为字符串赋值。您以后不能使用=分配它。

您必须使用strcpy()功能。

答案 1 :(得分: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

如果使用malloc,请确保释放one.name,以免浪费内存。

答案 2 :(得分:2)

使用strcpystrncpy在C中分配字符串。

答案 3 :(得分:1)

C没有内置字符串类型。您必须使用一个字符数组来保存字符串。

由于C也不允许将一个数组分配给另一个数组,因此必须使用标准C库中的各种函数将数组元素从一个数组复制到另一个数组,或者必须编写一个循环来自己完成。使用标准C库函数是首选,但有时候有理由编写自己的循环。

对于与char类型一起使用的标准ANSI类型字符串,有大量函数,其中大部分以str开头,例如复制或比较字符串strcpy()strcmp()的函数。您还可以指定要复制或比较的最大字符数,例如strncpy()strncmp()

C中的字符串是由二进制零字符终止的字符数组。因此,如果你使用一个常量字符串,如“常量”,这将创建一个字符数组,每个字符有一个元素加上零终止符的附加元素。

这意味着在调整char数组的大小时,你还必须记住再添加一个额外的数组元素来保存零终止符。

strncpy()函数将一个char数组复制到另一个char数组,直到指定的最大字符数或找到零终止符。如果达到最大字符数,那么目标数组将不会被零终止符终止,因此需要注意这一点。

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使用的宽字符。

答案 4 :(得分: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");
}