将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
限定符以确保安全。
如果这些限制都不适合您,您需要使用 strcpy
、strncpy
或更好的 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);
一些备注:
- 你不需要除以
sizeof char
因为它是根据定义 1
- 定义或初始化全局变量时只能使用常量表达式
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};
}
我正在尝试执行以下操作,使用其他 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
限定符以确保安全。
如果这些限制都不适合您,您需要使用 strcpy
、strncpy
或更好的 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);
一些备注:
- 你不需要除以
sizeof char
因为它是根据定义1
- 定义或初始化全局变量时只能使用常量表达式
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};
}