Строковые массивы в 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"};
Мне просто интересно узнать, что произойдет