Строковые массивы в C - PullRequest
       14

Строковые массивы в C

11 голосов
/ 02 марта 2010

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

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 -

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

Спасибо

Ответы [ 6 ]

14 голосов
/ 02 марта 2010

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

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

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

8 голосов
/ 02 марта 2010

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

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

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

2 голосов
/ 02 марта 2010

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

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

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

2 голосов
/ 02 марта 2010

Измените

char currencies[][3]

на

char currencies[][4]

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

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

0 голосов
/ 02 марта 2010

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

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

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

0 голосов
/ 02 марта 2010

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

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