У меня есть массив строк, который, когда я выполняю итерации через и печатаю его элементы, дает мне неожиданные результаты.
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 -
Может любой объяснять это поведение.
Спасибо
Вы пропускаете нулевые терминаторы, строки на самом деле имеют длину 4 символа. Каждая строка записывает нулевой терминатор предыдущей строки*. Попробуйте вместо этого:
char currencies[][4] = {"EUR", "GBP", "USD", "JPY", "CNY"};
* Как указал caf, это не "перезапись нулевого терминатора предыдущей строки", так как нулевой терминатор никогда не копируется в массив. Это случайность, что строка не имеет беспорядочного вывода после конечного '-'.
Вы заявляете, что это неправильно. Это сработает. Он просто позволяет компилятору создать массив указателей на константные символы:
const char *currencies[] = {"EUR", "GBP", "USD", "JPY", "CNY"};
РЕДАКТИРОВАТЬ: Создание двумерного массива, как ответ Чарльза Битти, тоже работает, если вы выделяете место для нуля. Также укажите, что символы являются const
, согласно Кристофу.
У вас есть не массив строк, а массив array-of-char. Вы можете использовать:
char* currencies[] = {"EUR", "GBP", "USD", "JPY", "CNY"}; // untested
, чтобы разрешить строки разной длины.
Измените
char currencies[][3]
на
char currencies[][4]
строки в C завершаются NULL, чтобы упростить их обработку (при печати, копировании и т. Д.).
пример: char str [] = "ABC";
объявит строку из 4 символов с \ 0
в качестве последнего символа (индекс 3).
В качестве подсказки всякий раз, когда при печати массива символов вы получаете неожиданные результаты, вы можете проверить, завершен ли массив символов NULL или нет.
Мой C довольно ржавый, но попробуйте:
char currencies[][3] = {"EUR\0", "GBP\0", "USD\0", "JPY\0", "CNY\0"};
Мне просто интересно узнать, что произойдет
Конечно. "EUR" имеет длину четыре символа - три буквы и один завершающий нулевой символ. Поскольку вы явно указываете трехсимвольные массивы, компилятор усекает, и поэтому ваши данные нанизаны друг на друга. Вам повезло, что в конце массива, очевидно, стоит нулевой символ, иначе вы могли бы получить всевозможный мусор. Измените объявление на char currencies[][4]
.