Проблема с массивом символов размера один и strcat - PullRequest
1 голос
/ 07 января 2010

Хорошо, я действительно смущен этим поведением в VS2008.

Этот код ..

char data[512] = "";

char c[1] = "";
c[0] = '1';

strcat(data, c);

.. приводит к установке data на это строковое значение: 1ÌÌÌÌhÿ

Конечно, это должно быть просто 1?

Как я могу убедиться, что data содержит только один символ [], который я копирую в него (т.е. 1)?

Почему strcat() копирует весь этот мусор? Почему c даже содержит этот мусор?

Спасибо за любую помощь

Редактировать: Спасибо всем.

Ответы [ 3 ]

12 голосов
/ 07 января 2010

Проблема в том, что вы передаете неверное значение в strcat. Ожидается, что второй параметр будет допустимым значением строки c. Чтобы быть действительным, это должен быть массив / указатель char значений, заканчивающийся нулевым терминатором (\0). Передаваемое вами значение не содержит нулевого терминатора и, следовательно, недопустимо.

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

char c[2];
c[0] = '1';
c[1] = '\0';
3 голосов
/ 07 января 2010

Нет, это не должно быть "просто 1". Ваш массив c не является C-строкой, так как вам не удалось завершить его нулем. Когда вы передаете что-то, что не является C-строкой, в strcat, поведение не определено. Это то, что вы наблюдаете в вашем случае.

Обратите внимание, что просто невозможно втиснуть нить "1" в массив размером 1. Вам нужен массив не менее 2 символов: один для символа '1' и один для символа нулевого конца.

Вы можете просто изменить декларацию c на

char c[2] = ""; 

и код будет работать как задумано (насколько я понимаю ваши намерения).

3 голосов
/ 07 января 2010

Потому что strcat () копирует C-String. C-строки завершаются '\ 0'. Поэтому, когда вы копируете «c», он начинается там, а затем просматривает память, пока не найдет место в памяти, связанное с «\ 0», а затем скопирует все это в данные.

Что вам нужно сделать, так это убедиться, что 'c' является реальной C-строкой ('\ 0' завершено)

char c[2] = {};  // Sets all members to '\0';
c[0]      = '1'; // Sets c[0] to '1' but leaves c[1] as '\0'

// c Is still a C-string as it is a sequence terminated with a '\0' character.
...