проблема с массивом в C - PullRequest
       1

проблема с массивом в C

1 голос
/ 02 ноября 2009
char label[8] = "abcdefgh";
char arr[7] = "abcdefg";

printf("%s\n",label);
printf("%s",arr);

==== выход ==========

ABCDEFGH

abcdefgÅ

Почему Å добавляется в конец строки arr? Я использую код C в Turbo C ++.

Ответы [ 4 ]

14 голосов
/ 02 ноября 2009

printf ожидает NUL-завершенные строки. Увеличьте размер ваших массивов символов на единицу, чтобы освободить место для завершающего символа NUL (он добавляется автоматически инициализатором = "...").

Если вы не завершите строки NUL, printf продолжит чтение, пока не найдет символ NUL, поэтому вы получите более или менее случайный результат.

6 голосов
/ 02 ноября 2009

Ваши переменные label и arr не являются строками. Они являются массивами символов.

Чтобы быть строками (и чтобы вы могли передавать их функциям, объявленным в ), им необходим терминатор NUL в отведенном для них пространстве.

Определение понятия "строка" из стандарта

    7.1.1 Definitions of terms
1   A string is a contiguous sequence of characters terminated by and including
    the first null character. The term multibyte string is sometimes used
    instead to emphasize special processing given to multibyte characters
    contained in the string or to avoid confusion with a wide string. A pointer
    to a string is a pointer to its initial (lowest addressed) character. The
    length of a string is the number of bytes preceding the null character and
    the value of a string is the sequence of the values of the contained
    characters, in order.
4 голосов
/ 02 ноября 2009

Ваша строка не заканчивается нулем, поэтому printf работает с ненужными данными. Вам нужно использовать '\ 0' в конце строки.

2 голосов
/ 02 ноября 2009

Используя GCC (в Linux), он печатает больше мусора:

abcdefgh°ÃÕÄÕ¿UTÞÄÕ¿UTÞ·
abcdefgabcdefgh°ÃÕÄÕ¿UTÞÄÕ¿UTÞ·

Это потому, что вы печатаете два символьных массива в виде строк (используя% s).

Это прекрасно работает:

char label[9] = "abcdefgh\0"; char arr[8] = "abcdefg\0";

printf("%s\n",label); printf("%s",arr);

Однако вам не нужно явно упоминать "\ 0". Просто убедитесь, что размер массива достаточно большой, т.е. на 1 больше, чем количество символов в ваших строках.

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