Почему для «массива char» требуется два из «[]», а для «массива int» требуется один «[]»? - PullRequest
0 голосов
/ 25 сентября 2019

В массиве char необходимо иметь 2 из [].Один из них предназначен для хранения индекса массива , а другой - для хранения значения для этого индекса:

char u[1][50];

strcpy(u[0],"test");
strcpy(u[1],"test 2");

printf("%s \n",u[1]);

Но в int массиву нужен только один [].

Это для индексного номера массива или для значения ?

Независимо отответ на этот вопрос ... Почему не существует 2 из []?

int z[100];

z[0] = 1;
z[1] = 2;

printf("%d \n",z[1]);

Почему должна быть «полная ответственность» для массива char, но для массива int естьне должна быть «полная ответственность»?

Почему существует 2 стандарта?

Может быть, вам не нужна «полная ответственность» для массивов?
Может быть, рассматривается номер индекса массивапо умолчанию, обычный и бесплатный материал?

Ну тогда в таком случае, для массива char, зачем нужны два из []?

Ответы [ 5 ]

9 голосов
/ 25 сентября 2019

Вам не нужно два []:

int main() {
    char u[50];
    strcpy(u, "test");
    printf("%s \n", u);
}

Просто строки представлены указателем на символ, поэтому передача одного char не работает.Вы все равно попробовали это, а затем изменили определение строки на многомерный массив char.Это избыточно и вызывает проблемы, когда вы делаете это:

char u[1][50];
strcpy(u[1],"test 2");

, что является неопределенным поведением, поскольку индекс первого массива должен быть 0.

Возможно, ваша путаница возникает из-за сравнения сint.Если вы хотите напечатать один char, используйте спецификатор формата %c (а затем передайте char, а не char*).Если вы сделаете это, это будет похоже на пример int:

int main() {
    char z[100];

    z[0] = '1';
    z[1] = '2';

    printf("%c \n", z[1]);
}
2 голосов
/ 25 сентября 2019

Массивы в C следуют следующим обозначениям:

type array_name[num_elements];
type array_name[num_rows][num_elements];
...

Так что в вашем случае вы можете захотеть иметь:

int z[100];

будет массивом из 100 int.Для доступа к любому из них вы используете z [0] для первого целого, z [1] для второго целого и т. Д. До z [99].

Точно так же вы можете захотеть иметь массив символов, таких какнапример:

char u[50];

для доступа к первому символу, который вы используете u [0] и т. д.

Когда речь идет о многомерных массивах, у вас может быть:

char u[10][50];

это означает, что у вас есть 10 строк по 50 элементов в каждом.Вы также можете называть их строками, поэтому 10 строк.

Чтобы получить доступ к первой строке, вы используете u [0].Последняя строка находится в u [9].

Теперь для каждой строки вы можете получить доступ к их элементам, например: u [0] [1] для доступа ко второму элементу первой строки.

strcpy требует в качестве первого аргумента строку.Так что если у вас есть u [10] [50], вы можете передать u [9], что будет последней строкой.Вы не должны передавать u [9] [2], который будет третьим символом из последней строки.

То, что вы сделали, это u [1] [50], что означает, что у вас так получилось только 1 строкав вашем списке строк.Вам все еще нужно следовать тем же правилам, что и для многомерных массивов, даже если это только 1 строка.Обычно вы используете u [50] и просто передаете его в strcpy

1 голос
/ 25 сентября 2019

... Независимо от ответа на этот вопрос ..
Почему нет 2 из []?

Семантика может влиять на ваше понимание массивов и ихтребования к индексации.C имеет массивы для int и char, для каждого из которых требуется один набор [] для определения.Существует специальный вид массива char в C, обычно называемый C String, который представляет собой обычный массив char с последним символом, являющимся нулевым терминатором: \0.Массив C strings обычно использует два набора скобок: [][].Правила для представления массива char такие же, как для представления массива int.оба могут быть описаны как набор значений, хранящихся в непрерывном наборе областей памяти.Для иллюстрации приведем примеры массивов int, char и C string:

int  numarr[]   = {99,104,97,114,32,97,114,114,97,121,0};
char chararr1[] = {'c','h','a','r',' ','a','r','r','a','y','\0'};
char chararr2[] = {99,104,97,114,32,97,114,114,97,121,0};
char string[]   = {"char array"}; 

Значения массива в каждом из 4 приведенных выше примеров идентичны.В большинстве реализаций массив int хранится в непрерывном наборе 4-байтовых областей памяти, в то время как каждый из массивов char хранится в смежном наборе 1-байтовых областей памяти.Три char массива, если они используются в printf(), приведут к одному и тому же выводу string , поскольку каждый из них является массивом char, оканчивающимся нулевым значением.

printf("%s\n%s\n%s\n", chararr1, chararr2, string);

массив символов
массив символов
массив символов

Подробнее о специальном массиве char - строка и массивах Cстрока

char string[] = {"this is a string"}; 

A C строка определяется как массив с нулевым символом в конце char: содержимое, размеченное между ^, равно string, определенному выше.Обратите внимание на нулевое завершение.

|t|h|i|s| |i|s| |a| |s|t|r|i|n|g|\0|?|?|
^                                  ^

Непрерывный набор строк C или массив строк C однако можно представить с помощью двух наборов квадратных скобок:

char strings[2][20] = {"first string", "second string"};

Этот массивстроки будет выглядеть в памяти так:

|f|i|r|s|t| |s|t|r|i|n|g|\0|s|e|c|o|n|d| |s|t|r|i|n|g|\0|?|?|?|
|       |           |      |
[0]     |           |      [1]   1st index used to access full string
        [0][4]='t'  [0][10]='n'  2nd index used to access array elements  

В то время как каждая строка может быть доступна с помощью первого индекса,

eg. strings[0] = "first string" and strings[1] = "second string"

каждый символ каждой строки может быть доступен с помощью первогои второй индекс

eg. strings[0][0] == 'f'  and strings[1][0] == 's'
1 голос
/ 25 сентября 2019

Ну тогда в таком случае ..

для массива символов, почему требуются два из []?

Не требуется ...

Ваша путаница, кажется, происходит из-за того, что строка (или текстовые строки) обрабатывается в C.

В C строка - это массив символов со специальным требованием, чтобы символ вмассив имеет значение NUL (aka '\0').Этот специальный символ представляет конец строки.

Таким образом, для создания массива строк вам необходимо использовать «two []» - пример:

char myStrings[10][101];

Переменная myStrings может содержать 10 строк, каждая из которых может иметь длину до 100 символов (примечание: не 101, потому что вам нужен один символ для хранения специального символа NUL).

Есливы просто делаете:

char someCharArray[101];

вы можете использовать его для хранения одна строка (макс. длина 100) или использовать его для хранения 101 отдельных символов.

0 голосов
/ 25 сентября 2019

Вы используете u для хранения массива 1 из строк , где каждая строка может иметь длину до 49 символов.

C не имеет фактического строкового типа - в C строка - это последовательность символьных значений, включая терминатор с 0 значениями.Строки хранятся в виде массивов символьного типа (char для кодировок ASCII, EBCDIC или UTF-8, wchar_t для "широких" кодировок).Таким образом, для хранения массива строк вам понадобится двумерный массив символьного типа (или одномерный массив указателей на символьный тип, где каждый элемент хранит адрес другого массива, но мы не будем вдаваться вчто здесь).

Итак,

char name[51];

может хранить одну строку длиной до 50 символов (с дополнительным элементом для терминатора 0):

printf( "Gimme a name: " );
scanf( "%s", name );

Сравните это с

char names[10][51];

, в котором может храниться до 10 строк, каждая из которых может быть длиной до 50 символов:

for ( size_t i = 0; i < 10; i++ )
{
  printf( "Gimme a string: ");
  scanf( "%s", names[i] );
}


На самом деле ваше объявление для u допускает только один элемент массива - strcpy(u[1], “test 2”); пытается скопировать строку в память после u, что приводит к неопределенномуповедение.
...