Добавление символьных массивов с использованием strcat не работает - PullRequest
2 голосов
/ 10 мая 2011

Может кто-нибудь сказать мне, что не так с этим кодом ???

char sms[] = "gr8";  
strcat (sms, " & :)");

Ответы [ 6 ]

14 голосов
/ 10 мая 2011

sms - это массив размером 4 1 . И вы добавляете больше символьных литералов, которые выходят за пределы массива, поскольку массив может вместить до 4 символов, которые уже заняты g, r, 8, \0.

1. Кстати, а почему именно 4? Ответ: потому что в конце есть нулевой символ!

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

char sms[10] = "gr8";  //ensure that size of the array is 10
                       //so it can be appended few chars later.
strcat (sms, " & :)");

Но тогда C ++ предлагает вам лучшее решение: используйте std::string как:

#include <string>  //must

std::string sms = "gr8";
sms += " & :)"; //string concatenation - easy and cute!
8 голосов
/ 10 мая 2011

Да, здесь нет места для дополнительных персонажей. sms[] только выделяет достаточно места для хранения строки, с которой она инициализируется.

Используя C ++, гораздо лучшее решение:

std::string sms = "gr8";
sms += " & :)";
4 голосов
/ 10 мая 2011

Вы копируете данные в нераспределенную память.

Когда вы делаете это: char sms[] = "gr8"; вы создаете массив символов с 4 символами, "gr8" плюс символ 0 в конце строки.

Затем вы пытаетесь скопировать дополнительные символы в массив с помощью вызова strcat за концом массива. Это приводит к неопределенному поведению, что означает, что произойдет что-то непредсказуемое (может произойти сбой программы или вы увидите странный вывод).

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

2 голосов
/ 10 мая 2011

В Си массивы не растут автоматически.

sms имеет определенную длину (4, в данном случае - три буквы и завершающий NULL). Когда вы вызываете strcat, вы пытаетесь добавить символы в этот массив после его длины.

Это неопределенное поведение, которое нарушит вашу программу.

Если бы вместо этого вы выделили массив с достаточно большим размером для размещения обеих строк, все будет в порядке:

char sms[9] = "gr8";
strcat (sms, " & :)");

C ++ имеет (в основном) те же ограничения на массивы, что и C. Тем не менее, он предоставляет средства более высокого уровня, благодаря которым вам не приходится иметь дело с массивами большую часть времени, например std::string:

#include <string>

// ...

std::string sms = "gr8";
sms += " & :)";

Причина, по которой это лучше, заключается в том, что вам не нужно заранее знать, какой длины будет ваша строка. C ++ увеличит базовое хранилище в памяти для вас.

1 голос
/ 10 мая 2011

Ваш буфер sms имеет длину всего 4 символа. strcat скопирует на конец еще 5 символов и испортит стек.

1 голос
/ 10 мая 2011

Переполнение буфера для массива символов с последующим где-то сбоем!

...