【问题标题】:Store char variables in other char variables in C将 char 变量存储在 C 中的其他 char 变量中
【发布时间】:2021-01-24 22:38:29
【问题描述】:

我正在尝试执行以下操作,使用其他 char 变量创建一个多字符数组。

char data_info_1[] = "Wellcome.";
char data_info_2[] = "Please";
char data_info_3[] = "If";

int size_line= sizeof(data_info_1)/sizeof(data_info_1[0]);

char data_info[3][size_line]={{data_info_1},{data_info_2},{data_info_3}};

一个解决方案将是以下一个,但我对将字符串直接放入 data_info 变量不感兴趣

char data_info[3][size_line]={{"Wellcome"},{"Please"},{"If"}};

请你解释一下为什么我写的第一件事是无效的。如果我的问题有解决方案。

谢谢。

【问题讨论】:

  • data_info_x 是一个指针,所以你需要一个指针数组。
  • @user3386109 data_info_x 是一个数组,而不是一个指针。对于上面发布的示例sizeof data_info_1 产生10,它看起来根本不像指针的大小。
  • @pmg 在初始化器char data_info[3][size_line]={{data_info_1} ...中,data_info_1是一个指针,所以data_info必须是一个指针数组。

标签: arrays c initialization declaration c-strings


【解决方案1】:

要回答您的问题,您的解决方案都不正确,您不能像这样初始化二维字符数组。

如果它不是可变大小的数组,则第二个选项将是有效的,

char data_info[3][10]={"Wellcome", "Please" ,"If"};
                   ^
            Valid -> fixed size

如果你有一个指针数组,这样的分配是可能的:

char *data_info[] = {data_info_1, data_info_2, data_info_3}; //1

或者

const char *data_info[] = {"Wellcome", "Please", "If"}; //2

但这些可能不是你所需要的。

选项 1 将包含指向原始字符串的指针,通过这些指针对它们所做的任何更改都将反映在原始字符串中。

选项 2,指针正在使用字符串字面量进行初始化,并且无法更改,这就是我添加 const 限定符作为安全指标的原因。

如果这些约束都不适合您,您需要使用strcpystrncpy 或更好的memcpy 之类的内容复制字符串:

#include <string.h>
//...
memcpy(data_info[0], data_info_1, sizeof data_info_1);
memcpy(data_info[1], data_info_2, sizeof data_info_2);
memcpy(data_info[2], data_info_3, sizeof data_info_3);

【讨论】:

  • 如果我决定使用您提出的指针解决方案,那么声明不应该是:char *data_info[] = {&data_info_1, &data_info_2, &data_info_3};。而不是 char *data_info[] = {data_info_1, data_info_2, data_info_3};
  • @SergioPrieto,它们是不兼容的类型,&amp;data_info_1 将是一个指向数组的指针,即char (*)[10],而每个初始化程序都应该是char*,一个指向数组开头的指针。您可以通过 char *data_info[] = {&amp;data_info_1[0], &amp;data_info_2[0], &amp;data_info_3[0]}; 传递每个 char 数组的第一个元素的地址。如果您像您建议的那样传递了一个指向数组的指针,那么char 将无法迭代char,而是以10 个chars 为一组,并会导致未定义的行为。如果我的解释不够清楚,请告诉我。
【解决方案2】:

数组不能由数组初始化。您可以像在此声明中所做的那样使用字符串文字初始化字符数组

char data_info[3][size_line]={{"Wellcome"},{"Please"},{"If"}};

相对于您的情况,您可以声明一个指向 char 的指针数组,例如

char * data_info[] = { data_info_1, data_info2, data_info3 };

【讨论】:

    【解决方案3】:

    一些备注:

    1. 你不需要除以sizeof char,因为它的定义是1
    2. 定义或初始化全局变量时只能使用常量表达式char data_info[3][sizeof(data_info_1)];

    要在另一个中“存储”一个字符数组,您需要复制它。初始化将不起作用,因为您无法分配数组。

    #include <string.h>
    
    char data_info_1[] = "Wellcome.";
    char data_info_2[] = "Please";
    char data_info_3[] = "If";
    
    char data_info[3][sizeof(data_info_1)];
    
    void foo(void)
    {
        strcpy(data_info[0], data_info_1);
        strcpy(data_info[1], data_info_2);
        strcpy(data_info[2], data_info_3);
    }
    
    

    只能分配结构或联合。所以你可以将数组包装到结构中,赋值或初始化将复制整个数组。

    struct stringWR
    {
        char str[50];
    };
    
    struct stringWR data_info_1 = {"Wellcome."};
    struct stringWR data_info_2 = {"Please"};
    struct stringWR data_info_3 = {"If"};
    
    struct stringWR data_info[3];
    
    
    void foo(void)
    {
        data_info[0] = data_info_1;
        data_info[1] = data_info_1;
        data_info[2] = data_info_1;
    }
    
    void bar(void)
    {
        struct stringWR data_info[3] = {data_info_1, data_info_2, data_info_2};
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      相关资源
      最近更新 更多