Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在C中的其他字符变量中存储字符变量_Arrays_C_Initialization_Declaration_C Strings - Fatal编程技术网

Arrays 在C中的其他字符变量中存储字符变量

Arrays 在C中的其他字符变量中存储字符变量,arrays,c,initialization,declaration,c-strings,Arrays,C,Initialization,Declaration,C Strings,我正在尝试执行以下操作,使用其他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

我正在尝试执行以下操作,使用其他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][size_line]={{"Wellcome"},{"Please"},{"If"}};
相对于您的案例,您可以声明指向char的指针数组,例如

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

为了回答您的问题,您的两种解决方案都不正确,您不能像这样初始化2D字符数组

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

如果您有一个指针数组,则可以进行类似的赋值:

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

但这些可能不是你需要的

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

选项2,指针是用字符串文本初始化的,不能更改,这就是为什么我添加了常量限定符作为安全指标

如果这两个约束都不适用于您,则需要使用strcpy、strncpy或更好的memcpy复制字符串:


为了回答您的问题,您的两种解决方案都不正确,您不能像这样初始化2D字符数组

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

如果您有一个指针数组,则可以进行类似的赋值:

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

但这些可能不是你需要的

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

选项2,指针是用字符串文本初始化的,不能更改,这就是为什么我添加了常量限定符作为安全指标

如果这两个约束都不适用于您,则需要使用strcpy、strncpy或更好的memcpy复制字符串:

一些评论:

您不需要除以字符的大小,因为它是定义1 定义或初始化全局变量char data_info[3][sizeofdata_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);
}

一些评论:

您不需要除以字符的大小,因为它是定义1 定义或初始化全局变量char data_info[3][sizeofdata_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);
}


data_info_x是一个指针,因此您需要一个指针数组。@user3386109 data_info_x是一个数组,而不是指针。对于上面发布的示例,sizeof data_info_1生成的10看起来根本不像指针的大小。@pmg在初始值设定项char data_info[3][size_行]={{data_info_1}…,data_info_1是一个指针,因此data_info必须是一个指针数组。data_info_x是一个指针数组,所以您需要一个指针数组。@user3386109 data_info_x是一个数组,而不是指针。例如,在上面发布的示例中,data_info_1的大小为10,看起来根本不像指针的大小。@pmg在初始值设定项char data_info[3][size_line]={{data_info_1}…,data_info_1是指针,因此data_info必须是指针数组。如果我决定使用您提出的指针解决方案,那么声明不应该是: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,它们是不兼容的类型,&data_info_1将是指向数组的指针,即char*[10],而每个初始值设定项都应是char*,指向数组的指针。您可以执行char*data_info[]={&data_info_1[0]、&data_info_2[0]、&data_info_3[0]};传递每个字符数组的第一个元素的地址。如果你像你建议的那样传递一个指向数组的指针,它将不是逐字符可写的,而是以10个字符的块为单位,并将导致未定义的行为。如果我的解释不够清楚,请让我知道。如果我决定使用你提出的指针解决方案,那么大小应该是这样的:char*data\u info[]={&data\u info\u 1,&data\u info\u 2,&data\u info\u 3};而不是char*data\u info[]={data\u info\u 1,data\u info\u 2,data\u info\u 3}@sergioprito,它们是不兼容的类型,&data\u info\u 1将是指向数组的指针,即char*[10],而每个 initializer应该是char*,一个指向数组的指针。您可以执行char*data\u info[]={&data\u info\u 1[0]、&data\u info\u 2[0]、&data\u info\u 3[0]};传递每个字符数组的第一个元素的地址。若你们像你们建议的那个样传递一个指向数组的指针,那个么它将不是逐字符可写的,而是10个字符的块,并且将导致未定义的行为。如果我的解释不够清楚,请告诉我。