C Массив строк

#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" },
};
  

Пример с упрощающим макросом, запущенным в ideone

Ответ №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]);
  

Это даст вам разницу между начальным адресом первой строки и начальным адресом второй строки. Следовательно, размер первой строки.

Затем вы могли бы использовать некоторый цикл и массив, чтобы получить все размеры.

Это не статично, но, возможно, вы могли бы попробовать это.