将char变量存储在C中的其他char变量中

Store char variables in other char variables in C

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

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"}};

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

谢谢。

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

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

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

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

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

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

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);

一些备注:

  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};
}