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

У меня есть массив строк, который, когда я выполняю итерации через и печатаю его элементы, дает мне неожиданные результаты.

char currencies[][3] = {"EUR", "GBP", "USD", "JPY", "CNY"};

void show_currencies()
{
    int i;
    for(i=0; i<5; i++)
    {
        printf("%s - ", currencies[i]);
    }
}

когда я звоню show_currencies() Я получаю это на выводе.

EURGBPUSDJPYCNY - GBPUSDJPYCNY - USDJPYCNY - JPYCNY - CNY -

Может любой объяснять это поведение.

Спасибо

11
задан 0xFF 2 March 2010 в 17:01
поделиться

6 ответов

Вы пропускаете нулевые терминаторы, строки на самом деле имеют длину 4 символа. Каждая строка записывает нулевой терминатор предыдущей строки*. Попробуйте вместо этого:

char currencies[][4] = {"EUR", "GBP", "USD", "JPY", "CNY"}; 

* Как указал caf, это не "перезапись нулевого терминатора предыдущей строки", так как нулевой терминатор никогда не копируется в массив. Это случайность, что строка не имеет беспорядочного вывода после конечного '-'.

14
ответ дан 3 December 2019 в 03:51
поделиться

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

const char *currencies[] = {"EUR", "GBP", "USD", "JPY", "CNY"};

РЕДАКТИРОВАТЬ: Создание двумерного массива, как ответ Чарльза Битти, тоже работает, если вы выделяете место для нуля. Также укажите, что символы являются const , согласно Кристофу.

8
ответ дан 3 December 2019 в 03:51
поделиться

У вас есть не массив строк, а массив array-of-char. Вы можете использовать:

char* currencies[] = {"EUR", "GBP", "USD", "JPY", "CNY"};  // untested

, чтобы разрешить строки разной длины.

2
ответ дан 3 December 2019 в 03:51
поделиться

Измените

char currencies[][3]

на

char currencies[][4]

строки в C завершаются NULL, чтобы упростить их обработку (при печати, копировании и т. Д.). пример: char str [] = "ABC"; объявит строку из 4 символов с \ 0 в качестве последнего символа (индекс 3).

В качестве подсказки всякий раз, когда при печати массива символов вы получаете неожиданные результаты, вы можете проверить, завершен ли массив символов NULL или нет.

2
ответ дан 3 December 2019 в 03:51
поделиться

Мой C довольно ржавый, но попробуйте:

char currencies[][3] = {"EUR\0", "GBP\0", "USD\0", "JPY\0", "CNY\0"};

Мне просто интересно узнать, что произойдет

0
ответ дан 3 December 2019 в 03:51
поделиться

Конечно. "EUR" имеет длину четыре символа - три буквы и один завершающий нулевой символ. Поскольку вы явно указываете трехсимвольные массивы, компилятор усекает, и поэтому ваши данные нанизаны друг на друга. Вам повезло, что в конце массива, очевидно, стоит нулевой символ, иначе вы могли бы получить всевозможный мусор. Измените объявление на char currencies[][4].

0
ответ дан 3 December 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: