#c #arrays #string
#c #массивы #строка
Вопрос:
Я хочу создать массив строк. Проблема в том, что я хочу иметь возможность статически получать доступ к длине каждой строки. Я пробовал это:
char *a[] = {"foo", "foobar"};
Массив работает нормально, за исключением того, что я хочу знать длину каждого элемента статически.
Я не могу использовать, sizeof(a[0])
потому что он возвращает размер char *
указателя. Что я хочу, так это длину размера строки (4 для a[0], 7 для a[1]).
Есть ли какой-либо способ сделать это?
Комментарии:
1. Допустим ли параллельный массив только для отслеживания размеров?
Ответ №1:
Короче говоря, нет, не во время компиляции (по крайней мере, не для произвольного количества строк). Существуют различные вещи, подобные инициализации во время выполнения, которые вы можете сделать, как указывали другие. И есть решения для фиксированного количества строк, как указывали другие.
Тип a[0]
должен быть таким же, как у a[1]
(очевидно). Поэтому sizeof()
должен вычисляться одинаково для всех значений a[i]
.
Ответ №2:
В зависимости от вашего определения «строки», a
это не массив строк: это массив указателей (я определяю «строку» как массив из N символов, включая нулевой ограничитель).
Если вам нужен массив длин и строк (каждая из которых способна содержать 999 символов и нулевой ограничитель), вы можете сделать что-то вроде
struct lenstring { size_t len; char data[1000]; };
struct lenstring a[] = {
{ sizeof "foo" - 1, "foo" },
{ sizeof "foobar" - 1, "foobar" },
};
Ответ №3:
Единственный безопасный способ узнать длину строк статически — это объявить их все по отдельности.
char foo[] = "foo";
char foobar[] = "foobar";
char *a[] = {foo, foobar};
Возможно, вы сможете использовать макрос для устранения некоторой рутинности, в зависимости от содержимого строк. sizeof(a[0])
все равно будет sizeof(char*)
, хотя.
Комментарии:
1. Не уверен, что вы можете использовать макрос. Строку
"foo"
можно превратить в полезный идентификатор, а строку"Hello, world!"
— нет.
Ответ №4:
Вы не можете статически инициализировать структуру данных результатом strlen(), вы могли бы перебирать свои строки и сохранять длину строки в функции инициализации.
Ответ №5:
Вы не можете. sizeof
возвращает не длину строки, а размер массива, который во втором случае намного больше длины строки. Вам нужно использовать strlen
или, возможно, более подходящий строковый тип:
struct {
size_t len;
char data[];
} string;
Но в этом случае было бы немного сложнее создать их массив.
Ответ №6:
если вы используете стиль декламации char*a[] = {«foo», …}, то вы можете использовать strlen(a[0]), strlen(a[1]) и т.д., Чтобы найти длину каждой строки.
Ответ №7:
Может быть, вы могли бы начать с чего-то вроде этого:
size1 = abs(a[0] - a[1]);
Это даст вам разницу между начальным адресом первой строки и начальным адресом второй строки. Следовательно, размер первой строки.
Затем вы могли бы использовать некоторый цикл и массив, чтобы получить все размеры.
Это не статично, но, возможно, вы могли бы попробовать это.