字符串矩阵中的字符串分配(不在声明时)

时间:2018-12-02 09:26:27

标签: 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 

请以任何方式建议我。

3 个答案:

答案 0 :(得分:2)

那又怎么样:

char str[10][4] = { "Yes", "No", "Yes", /* ... */ };

请注意,结尾的空字符还需要一个数组位置!

如上所示,其他(未分配)值设置为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 应用于字符串 literals –对于通过 pointer 接收的字符串,必须使用{而是使用{1}}(尽管strlen确实不计算终止的空字符)。

请注意,我故意不使用sizeof,因为如果知道长度,则memcpy效率更高;如果不知道,则strcpy是不安全的(由于超出目标数组界限而导致未定义的行为)

如果使用指针,事情会变得简单:

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;

答案 1 :(得分:1)

您的变量str代表大小为1 * 10 * 3字节(大小为char)的内存中的一个块。您的代码尝试执行的操作是将字符指针(char*)分配给数组(str[1][1]是一维数组),这没有任何意义。

因此,基本答案是您需要使用strncpy将字节“ YES”或“ NO”中的字节复制到数组中。

还请注意

  1. str[1][1]="YES"行的末尾缺少分号;
  2. 您的数组维没有空格可用于字符串的空终止符(“ YES”实际上是“ YES \ 0”)
  3. 您似乎从1而不是0开始索引,通常您不应该这样做,因为在C中,第一个索引是0,而不是1

答案 2 :(得分:0)

Carry索引中的第1个基于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更改为一个,则会更改all的值:

    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