字符串矩阵中的字符串赋值(不是在声明时)

  • 本文关键字:字符串 声明 赋值 c
  • 更新时间 :
  • 英文 :


我已经创建了这个程序:

#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"中的字节复制到数组中。

还要注意

  1. str[1][1]="YES"行末尾缺少分号;
  2. 数组维度没有空间容纳字符串的null终止符("YES"实际上是"YES\0"(
  3. 您似乎从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 

要实现这一点,您有三种可能性。

  1. 由于无法分配数组,请复制数组的内容。

    定义尺寸为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" */
    
  2. 如果你只需要使用"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 
    
  3. 如果不想单独更改字符串的字符,请将它们定义为2。以上,但通过以下操作将它们定义为指向常量的指针:

    char * yes = "YES";
    char * no = "NO";
    char * str[1][10];
    str[0][0] = yes;
    str[0][1] = no;
    str[0][2] = yes;
    

    以后不能更改char

最新更新