【问题标题】:String assignment in CC中的字符串赋值
【发布时间】:2012-08-08 12:20:30
【问题描述】:

我是 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 但分配不同。
  • 当您声明这样的数组char name[10]; 时,您将得到一个包含十个元素的数组,编号为 0 到 9(含)。所以a.name[10] 超出了数组的范围。尝试为其分配值不是一个好主意。
  • 在了解字符串之前,您需要先了解数组。

标签: c string


【解决方案1】:

您不能分配给数组。两种解决方案:要么复制字符串:

strcpy(a.name, "Markson");

或使用 const char 指针代替数组,然后您可以简单地分配它:

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

a.name = "Markson";

如果您想稍后修改“name”的内容,或者使用非常量字符指针:

struct {
    char *name;
}

a.name = strdup("Markson");

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

【讨论】:

  • 在第二种情况下name不应该是const char*吗? :)
  • @KirilKirov 已修复,并增加了一种可能性。 :)
  • 现在看起来更好了 :) +1 为您提供有竞争力的答案 :)
【解决方案2】:

你不能这样做

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

    【讨论】:

      【解决方案4】:

      因为在一种情况下您在声明中分配它,而在另一种情况下您没有。如果你想做等效的写:

      struct student a = {"Markson", 0};
      

      【讨论】:

      • 虽然初始化器类似于赋值(因此 OP 的困惑),但它不是一个。
      猜你喜欢
      • 2011-09-08
      • 2012-11-04
      • 2012-03-01
      • 2016-04-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      相关资源
      最近更新 更多