我已经创建了这个程序:
#include<stdio.h>
#include<conio.h>
void main()
{
char str[1][10][4];
str[1][1]="YES";
str[1][2]="NO";
printf("%s",str[1][1]);
getch();
}
str是一个有1行10列的矩阵。但是这个程序显示错误。
我想为每个字段分配(而不是扫描(值,如
str[1][1] str[1][2] str[1][3]..........
YES NO YES
请给我建议。
关于:
char str[10][4] = { "Yes", "No", "Yes", /* ... */ };
请注意,后面的null字符还需要一个数组位置!
如上所示,额外的(未分配的(值设置为0,因此如果没有提供足够的初始化程序,则会得到空字符串。
顺便说一句,可以将第一个数组参数放在变量下面,使用指定的初始化程序执行和操作:
char str[][4] = { [0] = "Yes", [7] = "Yes", [10] = "No", [12] = "No", /* ... */ };
同样,无符号值为0,外部数组长度为条目数(如果未使用指定的初始化程序(或足够长以包括所提供的最高索引(因此大小为最高索引+1(。
编辑:稍后分配:
char str[10][4];
// ...
memcpy(str[7], "Yes", sizeof("Yes"));
请注意,只能将sizeof
应用于字符串文字–对于通过指针接收的字符串,必须使用strlen
(不过后者不计算终止的null字符,而sizeof
计算(。
请注意,我故意不使用strcpy
,因为如果长度已知,则memcpy更有效,如果不知道,则strcpy
不安全(由于写入超出目标数组边界而有未定义行为的风险(。
如果你使用指针,事情会变得更容易:
char const* const YES = "Yes"; // constants for safer usage
char const* const NO = "No";
char const* str[10]; // array of pointers, not array of arrays
str [7] = NO;
当然,您仍然可以预初始化:
char const* str[10] = { YES, NO, YES, NO, /* ... */ };
您的变量str
表示内存中大小为1*10*3字节(大小为char
(的块。您的代码试图将一个字符指针(char*
(分配给一个数组(str[1][1]
是一维数组(,这毫无意义。
因此,基本答案是,您需要使用例如strncpy
将字符串"YES"或"NO"中的字节复制到数组中。
还要注意
- 第
str[1][1]="YES"
行末尾缺少分号;
- 数组维度没有空间容纳字符串的null终止符("YES"实际上是"YES\0"(
- 您似乎从1而不是0开始索引,通常不应该这样做,因为在C中,第一个索引是0,而不是1
C中的第一个arry索引是基于0的。所以你最喜欢不想要
str[1][1] str[1][2] str[1][3] YES NO YES
但
str[0][0] str[0][1] str[0][2] YES NO YES
要实现这一点,您有三种可能性。
-
由于无法分配数组,请复制数组的内容。
定义尺寸为4的
char
阵列的2D阵列,并将长度小于4个char
的任何阵列复制到中char str[1][10][4]; strcpy(str[0][0], "YES"); strcpy(str[0][1], "NO"); strcpy(str[0][2], "YES"); strcpy(str[0][3], "BAR");
您可以稍后单独更改每个
char
:strcpy(str[0][0][0] = '1'; /* gives you "1ES" */ strcpy(str[0][2][0] = '3'; /* gives you "2ES" */
-
如果你只需要使用
"YES"
和"NO"
,你可以定义它们一次,让你的数组成为指向char
的指针的2D数组,并让它的条目引用之前定义的值:char yes[] = "YES"; char no[] = "NO"; char * str[1][10]; str[0][0] = yes; str[0][1] = no; str[0][2] = yes;
如果您稍后将
char
更改为一个,则会更改所有的值:strcpy(str[0][0][0] = '1'; /* gives you "1ES" for str[0][0] and str[0][2] */ strcpy(str[0][2][0] = '2'; /* gives you "2ES" for str[0][0] and
-
如果不想单独更改字符串的字符,请将它们定义为2。以上,但通过以下操作将它们定义为指向常量的指针:
char * yes = "YES"; char * no = "NO"; char * str[1][10]; str[0][0] = yes; str[0][1] = no; str[0][2] = yes;
以后不能更改
char
。