【问题标题】:Why does assigning the string in the declaration work but not later?为什么在声明中分配字符串而不是稍后?
【发布时间】:2021-12-20 01:34:15
【问题描述】:

不确定我的措辞是否正确,我只是想知道为什么会打印出“Johnathan”:

#include <stdio.h>
int main()
{
    char personName[20] = "Johnathan";
    printf("%s", personName);
    return 0;
}

虽然不是这样:

#include<stdio.h>
int main()
{
    char personName[20];
    personName[20] = "Johnathan";
    printf("%s", personName);
    return 0;
}

我需要能够将字符串分配给其第一个实例之外的已声明数组(即 personName)。

【问题讨论】:

  • 这些是语言的规则。您可以对字符串 (char name[20] = "John";) 进行初始化,但不能直接赋值(尽管 strcpy(name, "Mary"); 有效)。
  • 顺便说一句:personName[20] 不存在。数组personName 有20 个元素,索引从019即使它存在,它也会有 char 类型,并且不可能单独保存一个字符串。

标签: arrays c initialization variable-assignment string-literals


【解决方案1】:

C 的最初开发始于对单个数字和其他数据的简单操作,这些操作很容易转换为一个或几个处理器指令。由程序员编写代码来执行复合操作,例如复制数组中的所有元素。

后来用字符串初始化数组。

由于 C 的发展,数组不能在 C 中用作整个对象。你不能将一个数组(如字符串文字)分配给另一个数组。每当在表达式中使用数组时,除非我们获取其大小(使用sizeof)或它的地址(使用&amp;)或执行某些初始化,否则数组会自动转换为指向其第一个元素的指针。

因此,如果我们尝试写入personName = "Jonathan";,它会失败,因为personName 在此转换后不是数组;所以我们实际上不能写一个赋值给一个数组。

另外,在personName[20] = "Jonathan";中,personName[20]的类型是单个字符;如果有的话,它将是数组中索引为 20 的元素。

我们可以在声明中使用字符串字面量来初始化数组。初始化使用不是赋值的特殊形式。在声明中,等号不是赋值运算符;它是一个开始初始值列表的符号。此外,初始化仅初始化命名对象 (personName),而不是由声明中的额外部分组成的表达式 (personName[20])。这是声明与表达式不同的一部分。声明可能在名称周围有额外的部分(称为标识符),例如[20] 用于数组,(…) 用于函数,* 用于指针,但只有命名对象被初始化,而不是由那些额外部分组成的表达式。

要“分配”具有新字符串值的数组,您可以使用strcpy,如strcpy(personName, "Jonathan");。数组必须为字符串留出空间,包括终止字符串的空字符。要声明 strcpy,请在程序中包含 #include &lt;string.h&gt; 行。

【讨论】:

    【解决方案2】:

    此声明

    char personName[20] = "Johnathan";
    

    声明一个字符数组,该数组由字符串文字"Johnathan"的符号显式初始化。

    所以数组包含由字符串字面量表示的字符串。

    另一种声明可能如下所示

    char personName[20] = { "Johnathan" };
    

    在这个赋值语句中

    personName[20] = "Johnathan";
    

    您正在尝试使用指向字符串文字的第一个元素的指针初始化数组personName 的不存在元素personName[20](数组的有效索引范围是[0, 19])字符串文字被隐式转换。

    所以这个说法

    printf("%s", personName);
    

    尝试输出导致未定义行为的非初始化字符数组。

    你也可以不写

    personName = "Johnathan";
    

    因为数组没有赋值运算符。

    相反,您可以在声明后将字符串文字的元素复制到数组中

    #include <string.h>
    
    //...
    
    strcpy( personName, "Johnathan" );
    

    【讨论】:

      猜你喜欢
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2011-03-11
      • 2021-07-10
      相关资源
      最近更新 更多