Странное значение, когда я объявляю строку в C - PullRequest
1 голос
/ 15 ноября 2010

Я хочу объявить строку, которая будет содержать 4 символа

char st[4];
memcpy(st,"test",4);

но когда я печатаю st ... у меня есть "test" и некоторые другие символы, напечатанные после него - что в этом плохого?

Большое спасибо

Ответы [ 3 ]

11 голосов
/ 15 ноября 2010
Строки

C, такие как строковый литерал "test", заканчиваются NUL, что означает, что последний символ равен '\ 0':

{'t', 'e', 's', 't', '\0'}

Вам нужно будет использовать st[5] и скопировать 5символы, чтобы иметь место для (и включить) NUL.Как есть, вы не включили его в копию.Таким образом, st выглядит следующим образом:

{'t', 'e', 's', 't', X, X, X ... '\0'}

Когда вы печатаете, C продолжает читать бессмысленные значения, которые совпадают в памяти (X выше), пока не найдет NUL.

Лучшее решение - исключить memcpy, и пусть компилятор определит размер вашей инициализации:

char st[] = "test";

sizeof(st) теперь будет 5.

2 голосов
/ 16 ноября 2010

Если по какой-то странной причине вы хотите сохранить свой код как есть, сделайте следующее:

char st[4];
memcpy(st,"test",4);
int i;
for(i = 0; i < 4; i++)
   printf("%c",st[i]);

Теперь он будет печататься нормально. Но прочитайте другие ответы, чтобы увидеть, что ваше программирование не в порядке.

2 голосов
/ 16 ноября 2010

Если вы действительно хотите использовать memcpy(), вам также нужно скопировать завершающий нулевой байт:

char st[5];
memcpy(st, "test", 5);

запомните, в памяти "test" выглядит так:

74 65 73 74 00
t  e  s  t  \0

, поэтому вам нужно скопировать 5 байтов.

Если вы не копируете нулевой байт, функции, работающие со строками с нулевым символом в конце, такими как printf(), будут читать память до тех пор, пока они не достигнуткакой-то случайный нулевой байт ...

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