C语言中的字符串赋值

3

我是新手学习C语言。下面代码中的字符串赋值可行:

#include<stdio.h>
int main(void){
  char str[] = "string";
  printf("%s\n",str);
}

但是在下面的情况下不起作用,即使我给name[]提供了索引号:

#include <stdio.h>
int main(void){
  struct student {
    char name[10];
    int  salary;
  };
  struct student a;
  a.name[10] = "Markson";
  a.salary = 100;
  printf("the name is %s\n",a.name);
  return 0;
}

为什么会发生这种情况?

char name[10] 等同于 char* name,但它们的内存分配方式不同。 - Zaffy
当你声明一个像这样的数组:char name[10];,你会得到一个有十个元素的数组,编号从0到9(包括)。所以 a.name[10] 超出了数组的范围。尝试为它赋值不是一个好主意。 - David Schwartz
在学习字符串之前,您需要了解数组。 - Lundin
4个回答

7
您无法给数组赋值。有两种解决方案:要么复制该字符串:
strcpy(a.name, "Markson");

或者使用const char指针代替数组,然后您可以简单地进行赋值:

struct {
    const char *name;
    /* etc. */
};

a.name = "Markson";

如果你希望稍后更改"名称"的内容,请使用非const字符指针:

struct {
    char *name;
}

a.name = strdup("Markson");

(在后一种情况下,不要忘记释放由strdup()分配的内存!)

在第二种情况下,name 不应该是一个 const char* 吗? :) - Kiril Kirov
@KirilKirov 已修正,并添加了另一种可能性。 :) - user529758
看起来现在更好了 :) +1 为你的有竞争力的回答 :) - Kiril Kirov

6

你不能这样做

a.name[10] = "Markson";

你需要使用strcpy将字符串"Markson"复制到a.name中。 strcpy声明:
char * strcpy ( char * destination, const char * source );

所以,你需要...
strcpy( a.name, "Markson" );

3

char str[] = "string"; 是一个声明,你可以给这个字符串赋初值。

name[10] 标识了字符串中的单个字符,所以你可以给它赋单个字符,但不能是一个字符串。

在声明之外,C风格字符串没有简单的赋值方式。你需要使用 strcpy 来实现。


0
因为在一个情况下你在声明中赋值,而在另一个情况下你没有。如果你想要做相同的操作,请这样写:
struct student a = {"Markson", 0};

1
尽管初始化程序类似于赋值(因此 OP 感到困惑),但它并不是赋值。 - Jim Balter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接