Двумерный массив символов в C / C ++

0

В чем разница между

char (CharBuff[50])[10];

а также

char CharBuff[10][50];

Мое требование состоит в том, чтобы иметь 10 символьных буферов, каждая из которых 50 макс (включая нулевой завершающий символ)

И я хотел бы получить доступ к буферам как CharBuff [0], CharBuff [1] и так далее.

  • 0
    И да, используйте вектор и строку.
  • 2
    @P0W P0W Нет, они не одинаковые! Смотрите здесь
Показать ещё 2 комментария
Теги:
arrays

7 ответов

2
Лучший ответ
char (CharBuff[50])[10];

объявляет CharBuff как 50-элементный массив из 10-элементных массивов char. В этом случае скобки являются излишними.

char CharBuff[10][50];

объявляет CharBuff как 10-элементный массив из 50-элементных массивов char.

Учитывая, что вам нужно 10 строк длиной до 50 символов, вы должны использовать вторую форму; тип каждого CharBuff[i] будет "50-элементным массивом char ".

Если вы действительно хотели создать отдельное определение типа для 50-элементного массива char, вы можете сделать что-то вроде

typedef char Str[50];  
...
Str CharBuff[10];

Теперь CharBuff представляет собой 10-элементный массив Str, который представляет собой 50-элементный массив char.

Обычно я не создавал бы отдельный typedef, как это, если бы я не хотел сделать Str opaque; то есть я не хочу раскрывать детали его реализации кому бы то ни было. В дополнение к typedef, я бы также предоставил API для распределения, назначения, копирования, форматирования и отображения объектов типа Str.

Иными словами, если человек, использующий тип Str, должен знать, что это 50-элементный массив char, чтобы использовать его правильно, тогда лучше просто использовать их для 50-элементного массива char.

1

Другие ответы здесь, которые говорят, что они те же самые, ошибаются! Оба не являются одинаковыми массивами и их размеры сильно отличаются. Вот фрагмент, показывающий, что:

char i[50][10];
std::cout << sizeof(i[1]) << '\n';

char (j[10])[50];
std::cout << sizeof(j[1]) << '\n';

10

50

Вы можете увидеть живой пример здесь.

i - это 50-элементный массив, каждый элемент которого представляет собой массив из десяти элементов, а j - это 10-элементный массив, каждый из которых представляет собой массив из 50 элементов. Хотя общие размеры обоих вариантов будут одинаковыми, размер элемента на каждом уровне будет другим. Если вы предполагаете, что они одинаковы, это приведет к неопределенному поведению

i[25][5]  // OK
j[25][5]  // accessing j beyond index 9 is undefined behaviour!

Это показывает, что круглые скобки не имеют значения в объявлении без указателя, без ссылки, т. char (j[10])[50] - просто путаная нотация для char j[10][50].

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

Затем вы должны объявить свой массив как char CharBuff[10][50].

0

Большая проблема, которую я вижу здесь, - путать синтаксис. Когда вы используете скобки, они уже знают роли в синтаксисе c и c++, такие как преобразования типов, указатели на функции (которые немного похожи на написанные вами). Что вы используете для добавления нового значения, которое делает код более запутанным и игнорирует тот факт, что c и c++ имеют отличный и интуитивно понятный способ для любого, кто хотя бы раз использовал матрицы, чтобы выразить 2d массивы. Итак, для чистого и непонятного синтаксиса используйте последнюю версию:

char CharBuff[10][50];
  • 0
    получил это, для однозначности, могу ли я объявить typedef для символьного буфера из 50 символов, назвать его как CHAR50 и использовать CHAR50 CharBuf [10];
0

Идите за последним, так как в нем четко указано, что вы выделяете.
Однако, поскольку вопрос также отмечен c++, я бы посоветовал использовать std::vector и std::string как следует:

std::vector<std::string> CharBuff(10, std::string(50, '\0'));

  • 0
    По моему опыту, возиться с нулевым терминатором и std::string не очень хорошая идея. std::vector<std::vector<char>> CharBuff(10, std::vector<char>(50)); это лучше.
  • 0
    @NeilKirk К сожалению, вы должны предоставить символ для заполнения. Хотя это может быть полезно иногда, в этом случае это может быть не так. В любом случае вы можете просто использовать resize внутри диапазона.
Показать ещё 2 комментария
0

Последний синтаксис будет опытным и менее запутанным, поскольку вам необходимо 10 строк (буферов символов), имеющих длину 50 каждый.

0

Никто никогда не использовал бывших, всегда используйте последнюю форму:

char CharBuff[10][50];
-2

Вы ищете 10 массивов по 50 символов.

Чтобы объявить один буфер объемом 50 байт, вы должны использовать

char CharBuff [50];

Но вы хотите иметь 10 буферов, поэтому просто примените это значение до [50], например:

char CharBuff [10] [50];

Теперь CharBuff [0] будет обращаться к первому пятибайтовому буферу, CharBuff [1] получит второе и так далее.

  • 0
    CharBuff[0] обращается к первому десятибайтовому массиву . Просто сделайте sizeof(CharBuff[0]) и вы увидите ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню