что означает 2-й ярлык [1st] [2nd] в значении 2Darray, например, .char label [11] [6] - PullRequest
0 голосов
/ 20 октября 2019

#int main() 
{
    int a, b;
    scanf("%d\n%d", &a, &b);

    char labels[11][6] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "even", "odd"};
    int labels_index;
    for (int i=a; i<=b; i++) {
        labels_index = i <= 9 ? i - 1 : 9 + i % 2;
        printf("%s\n", labels[labels_index]);
    }

    return 0;
}

when i am changing [6] to [5] i am getting error why is this happening 1. это длина символа 2. что означают данные в 2-х квадратных скобках в массиве 2d, я знаю один для строк, а другой для столбцов

Ответы [ 2 ]

0 голосов
/ 20 октября 2019
  1. В C строки представлены как char []. Строка всегда должна заканчиваться последним символом в массиве, являющимся нулевым символом, "\ 0". Нулевой символ имеет целочисленное значение 0. Чтобы объявить строку, размер строки всегда будет "# символ" + "нуль-символ". Вот почему код не запустится, если вы измените второе число в объявлении массива с 6 на 5, поскольку для представления слова «три» в виде строки необходим массив символов ['t', 'h', 'r',' e ',' e ',' \ 0 '], длина которого 6 символов.

  2. Когда вы выделяете 2d массив, например, int arr [a] [b]Вы выделяете пространство в памяти размером "size of" * a * b. В памяти это представлено одной длинной «полосой» памяти. Вот почему вы можете индексировать в 2d массив, используя arr [x] [y] или arr [x * a + y].

Следующий код распечатывает весь 2d блокпамяти как в виде символов, так и целых чисел.

/******************************************************************************

                            Online C Compiler.
                Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <stdio.h>

int main()
{
    int row = 11;
    int col = 6;
    //scanf("%d\n%d", &a, &b);

    char labels[11][6] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "even", "odd"};

    // Header
    printf("\n== labels as char ==\n");
    printf("    ");
    for (int y = 0; y < col; y++) printf("%-2i ", y);
    printf("\n");

    for (int x = 0; x < row; x++)
    {
        printf("%2i ", x);
        for (int y = 0; y < col; y++)
        {
            printf("%2c ", labels[x][y]);
        }
        printf("\n");
    }

    // Header
    printf("\n== labels as int ==\n");
    printf("    ");
    for (int y = 0; y < col; y++) printf("%-3i ", y);
    printf("\n");

    for (int x = 0; x < row; x++)
    {
        printf("%3i ", x);
        for (int y = 0; y < col; y++)
        {
            printf("%3i ", labels[x][y]);
        }
        printf("\n");
    }

    return 0;
}

При запуске код генерирует следующий вывод.

== labels as char ==
    0  1  2  3  4  5  
 0  o  n  e       
 1  t  w  o       
 2  t  h  r  e  e   
 3  f  o  u  r     
 4  f  i  v  e     
 5  s  i  x       
 6  s  e  v  e  n   
 7  e  i  g  h  t   
 8  n  i  n  e     
 9  e  v  e  n     
10  o  d  d       

== labels as int ==
    0   1   2   3   4   5   
  0 111 110 101   0   0   0 
  1 116 119 111   0   0   0 
  2 116 104 114 101 101   0 
  3 102 111 117 114   0   0 
  4 102 105 118 101   0   0 
  5 115 105 120   0   0   0 
  6 115 101 118 101 110   0 
  7 101 105 103 104 116   0 
  8 110 105 110 101   0   0 
  9 101 118 101 110   0   0 
 10 111 100 100   0   0   0 

Как видите, все символы, не используемые строками, имеют нулевойсимволы, обозначающие конец слова.

0 голосов
/ 20 октября 2019

Вы объявляете двумерный массив символов. 11 строк, 6 столбцов, и попытайтесь инициализировать его списком строк («один», «два», ...).

Для записи «три» (3-я строка) вам потребуется:не менее 6 символов - включая завершающий nul char ('t', 'h', 'r', 'e', ​​'e', ​​'\ 0'). Если вы уменьшите 2-е измерение до 5, оно не подходит.

...