Строковые массивы в 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 -

Может ли кто-нибудь объяснить это поведение.

Спасибо

Ответ 1

Вам не хватает nul-терминаторов, строки длиной 4 символа. Затем каждая строка записывает предыдущий нулевой ограничитель строки *. Попробуйте вместо этого:

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

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

Ответ 2

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

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

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

Ответ 3

Изменить

char currencies[][3]

к

char currencies[][4]
Строки

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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