【问题标题】:Write string into initialised blank char array [duplicate]将字符串写入初始化的空白字符数组[重复]
【发布时间】:2014-12-30 03:38:29
【问题描述】:

我刚刚开始学习 C,我对如何将字符串写入 C 中的简单 char 数组感到困惑。我知道 C 没有字符串数据类型,并且我读到大多数网站都在其中一个中声明字符串这边

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char greeting[] = "Hello";

但是如果我已经初始化了一个 char 数组

char greeting[50];

我尝试给它一个字符串值。

char greeting[50];
greeting = "Zack";

我收到错误消息,为什么?

【问题讨论】:

  • 在 C 中,数组是一个常量引用。您无法更改它们。

标签: c


【解决方案1】:

strcpy 旨在复制“字符串”。 使用如下:

char greeting[50];
strcpy(greeting, "Zack");

如果目的地不够大,请注意潜在的超限。

【讨论】:

    【解决方案2】:

    使用标头<string.h>中声明的标准函数strcpy将字符串复制到字符数组中

    #include <string.h>
    
    //...
    
    char greeting[50];
    strcpy( greeting, "Zack" );
    

    在标题&lt;string.h&gt; 中声明的其他函数也可用于复制字符数组中的字符串。例如

    memcpy
    strncpy
    strcat
    strncat
    

    使用strcat 代替strcpy 的示例

    #include <string.h>
    
    //...
    
    char greeting[50];
    
    greeting[0] = '\0';
    strcat( greeting, "Zack" );
    

    数组没有赋值运算符。所以编译器会针对这段代码sn-p发出错误

    char greeting[50];
    greeting = "Zack";
    

    但是当你可以分配字符数组时有一个技巧。为此,您需要将字符数组包含在结构中并使用复合文字。例如。与数组相反,结构具有执行结构的成员复制的赋值运算符。

    #include <stdio.h>
    #include <string.h>
    
    int main(void) 
    {
        struct A { char greeting[50]; } s;
        s = ( struct A) { "Zack" };
    
        puts( s.greeting );
    
        return 0;
    }
    

    输出将是

    Zack
    

    要编译此代码,您需要一个支持 C99 的编译器。

    【讨论】:

      【解决方案3】:

      你使用strcpy():

      char greeting[50];
      
      strcpy(greeting, "Zack");
      

      这会将四个字符和终止零复制到greeting

      注意它对greeting 的可用空间一无所知,因此完全有可能做错事。

      【讨论】:

        【解决方案4】:

        您遇到错误是因为您基本上是在尝试将字符串常量分配给数组。数组greeting 衰减为一个指针,但它是一个char *const 指针。

        您需要使用strcpy 来复制文字。

        【讨论】:

          【解决方案5】:

          在 C 中,以下代码将打印“foo”:

          char greeting[50];
          if(greeting == &greeting[0]){
              printf("foo");
          }
          else{
              printf("bar");
          }
          

          这是因为数组的变量 (greeting) 包含指向它的第一个元素 (greeting[0]) 的指针。

          所以,如果你指定:

          greeting = "Zack";
          

          你是说:让 greeting 有字符串 "Zack" 在内存中的地址。

          由于不允许更改数组的地址,因此会出现错误。

          【讨论】:

          • 这就是为什么你必须按照@doctorlove 的回答来完成这个任务
          • @user3204469 数组包含指向其第一个元素的指针是错误的说法。
          • @Baldrickk,我明白问题是:“为什么这个说法是错误的?”不是“如何将字符串复制到数组?”。对不起,我的误解。
          • @user3204469 看来您在宽限期内编辑了答案,而当我发表评论时它还没有更新。现在看起来很好,虽然它应该说“数组变量 (greeting) 降级为指向第一个元素的指针”,因为正如 Vlad 所说,数组不包含指向自身的指针......
          猜你喜欢
          • 2015-07-25
          • 2016-11-20
          • 2010-12-03
          • 2013-07-05
          • 1970-01-01
          • 2012-07-18
          • 1970-01-01
          • 2011-12-11
          相关资源
          最近更新 更多