strcat Место записи нарушения прав доступа С++

Я получаю сообщение об ошибке:

Необработанное исключение по адресу 0x5AAF40D9 (msvcr120d.dll) в Homework6_10_7.exe: >0xC0000005: место записи нарушения прав доступа 0x006A0000.

При запуске этого кода:

int main()
{
//variables
const int SIZE = 30;
char first[SIZE];
char middle[SIZE];
char last[SIZE];
char full[100];
const char comma[2] = { ',', '\0'};
const char space[2] = { ' ', '\0' };
int length = 0;

//Get the user names
cout << "Enter your first name: ";
cin.getline(first, 30);

cout << "Enter your middle name: ";
cin.getline(middle, 30);

cout << "Enter your last name: ";
cin.getline(last, 30);

//Puts the given name values into the full desired format,
strcat(full, last);
strcat(full, comma);
strcat(full, space);    
strcat(full, first);
strcat(full, space);    
strcat(full, middle);

//outputs the full name array.
cout << "Welcome new user " << full << endl;

system("PAUSE");

return 0;
}

Есть что-то, чего мне не хватает? кажется, что strcat вызывает проблему, но я не уверен, почему. Любая помощь приветствуется, спасибо.


person Zelf    schedule 14.03.2015    source источник
comment
strcat(full, last); Вы знаете, что full лучше уже содержать допустимую завершающую строку, верно? Ваш в настоящее время не определен.   -  person WhozCraig    schedule 15.03.2015
comment
У вас ошибка. Вы не используете std::string.   -  person nvoigt    schedule 15.03.2015


Ответы (2)


strcat добавляет копию исходной строки к строке назначения. Завершающий нулевой символ в приемнике перезаписывается первым символом источника, а нулевой символ включается в конец новой строки, образованной конкатенацией обоих в приемнике.

Но вы наверняка не имеете завершающий нулевой символ, потому что вы не инициализировали нулем full:

char full[100] = {};

В любом случае, вы должны использовать std::string.

person Lightness Races in Orbit    schedule 14.03.2015
comment
Или просто добавьте *full = 0; перед оставшимся кодом, если вы не хотите заполнять буфер нулями, который вы все равно собираетесь перезаписать. И, конечно же, можно было бы также полностью избавиться от last и просто прочитать фамилию непосредственно в full в первую очередь (поскольку она все равно там окажется). - person WhozCraig; 15.03.2015
comment
Спасибо! Да, я хотел бы просто использовать строку, но это задание специально требует cstring ›‹ Спасибо за помощь! Я просто добавил скобки, и теперь это работает. - person Zelf; 15.03.2015

при печати полной строки последний символ строки не равен нулю, и в этом проблема, попробуйте добавить это перед добавлением к полной строке, подобной этой

for (int i = 0; i < 100; i++)
    full[i] = '\0';

или вы можете просто сделать это

char full[100] = {};
person Allloush    schedule 14.03.2015