C Массив строк - PullRequest
       19

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

5 голосов
/ 06 июня 2011

Я хочу создать массив строк.Проблема в том, что я хочу, чтобы иметь доступ к длине каждой строки статически.Я попробовал это:

char *a[] = {"foo", "foobar"};

Массив работает нормально, за исключением того, что я хочу знать длину каждого элемента статически.Я не могу использовать sizeof(a[0]), потому что он возвращает размер указателя char *.То, что я хочу, это длина размера строки (4 для [0], 7 для [1]).

Есть ли способ сделать это?

Ответы [ 7 ]

4 голосов
/ 06 июня 2011

В зависимости от вашего определения «строки», a - это не массив строк: это массив указателей (я определяю «строку» как массив из N символов, включая нулевой терминатор).

Если вам нужен массив длин и строк (каждая из которых может содержать 999 символов и нулевой терминатор), вы можете сделать что-то вроде

struct lenstring { size_t len; char data[1000]; };
struct lenstring a[] = {
      { sizeof "foo" - 1, "foo" },
      { sizeof "foobar" - 1, "foobar" },
};

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

4 голосов
/ 06 июня 2011

Короче говоря, нет, не во время компиляции (по крайней мере, для произвольного числа строк). Как указали другие, существуют различные вещи, подобные инициализации во время выполнения. И есть решения для фиксированного числа строк, как указывали другие.

Тип a[0] должен совпадать с типом a[1] (очевидно). Так что sizeof() должно быть одинаковым для всех значений a[i].

3 голосов
/ 06 июня 2011

Единственный безопасный способ статического определения длины строк - это объявить их все по отдельности.

char foo[] = "foo";
char foobar[] = "foobar";

char *a[] = {foo, foobar};

Возможно, вам удастся использовать макрос для устранения некоторых трудоемких действий, в зависимости от содержимого строк. sizeof(a[0]) все равно будет sizeof(char*), однако.

1 голос
/ 06 июня 2011

Вы не можете.sizeof не возвращает длину строки, но размер массива, который во втором случае намного больше, чем длина строки.Вам нужно использовать strlen или, возможно, более удобный тип строки:

struct {
  size_t len;
  char data[]; 
} string;

Но в этом случае было бы немного сложнее создать их массив.

1 голос
/ 06 июня 2011

Вы не можете статически инициализировать структуру данных с помощью результата strlen (), вы можете перебрать строки и сохранить длину строки в функции инициализации.

0 голосов
/ 06 июня 2011

Может быть, вы могли бы начать что-то вроде этого:

size1 = abs(a[0] - a[1]);

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

Тогда вы можете использовать цикл и массив для получения всех размеров.

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

0 голосов
/ 06 июня 2011

если вы используете стиль объявления char * a [] = {"foo", ...}, то вы можете использовать strlen (a [0]), strlen (a [1]) и т. Д. каждая строка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...