Как напечатать массив символов в C ++ - PullRequest
7 голосов
/ 22 ноября 2011

как я могу напечатать массив символов, который я инициализирую и затем объединяю с другим массивом символов? Пожалуйста, смотрите код ниже

int main () {
char dest[1020];
char source[7]="baby";
cout <<"source: " <<source <<endl;
cout <<"return value: "<<strcat(dest, source) <<endl;
cout << "pointer pass: "<<dest <<endl;
return 0;
}

это вывод

source: baby
return value: v����baby
pointer pass: v����baby

В основном я хотел бы увидеть вывод печати

source: baby
return value: baby
pointer pass: baby

Ответы [ 4 ]

9 голосов
/ 22 ноября 2011

Вы не инициализировали dest

char dest[1020] = ""; //should fix it

Вам просто повезло, что так случилось, что 6-е (случайное) значение в dest было 0.Если бы это был 1000-й символ, ваше возвращаемое значение было бы намного длиннее.Если бы оно было больше 1024, вы бы получили неопределенное поведение.

Строки в виде массивов char должны быть разделены 0.В противном случае невозможно сказать, где они заканчиваются.В качестве альтернативы вы можете сказать, что строка заканчивается нулевым символом, явно установив ее на 0;

char dest[1020];
dest[0] = 0;

Или вы можете инициализировать весь массив с помощью 0 *

char dest[1024] = {};

И так как ваш вопроспомечен C++ Не могу не отметить, что в C ++ мы используем std::string s, которые избавляют вас от головной боли.Оператор + может использоваться для объединения двух std::string с

4 голосов
/ 22 ноября 2011

Не используйте char[].Если вы напишите:

std::string dest;
std::string source( "baby" )
//  ...
dest += source;

, у вас не будет проблем.(На самом деле ваша проблема связана с тем, что strcat требует в качестве первого аргумента завершенную строку '\0', а вы предоставляете ей случайные данные. Что является неопределенным поведением.)

1 голос
/ 22 ноября 2011

ваш dest массив не инициализирован. поэтому strcat пытается добавить source к концу dest, который определяется завершающим символом '\0', но не определено, где может заканчиваться неинициализированный массив ... (если это вообще происходит ...)

так что в итоге вы печатаете более или менее случайные символы, пока случайно не появится '\0' символ ...

0 голосов
/ 22 ноября 2011

Попробуйте это

#include <iostream>

using namespace std;

int main()
{
    char dest[1020];
    memset (dest, 0, sizeof(dest));
    char source[7] = "baby";
    cout << "Source: " << source << endl;
    cout << "return value: " << strcat_s(dest, source) << endl;
    cout << "pointer pass: " << dest << endl;
    getchar();
    return 0;
}

Использовал VS 2010 Express. очистите память, используя memset , как только вы объявите dest, это станет более безопасным. Также, если вы используете VC ++, используйте strcat_s () вместо strcat ().

...