7

how can i print a char array such i initialize and then concatenate to another char array? Please see code below

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;
}

this is the output

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

basically i would like to see the output print

source: baby
return value: baby
pointer pass: baby
1
  • 6
    Try zeroing out your dest array first. char dest[1020] = {0}; Commented Nov 22, 2011 at 15:43

4 Answers 4

9

You haven't initialized dest

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

You were just lucky that it so happened that the 6th (random) value in dest was 0. If it was the 1000th character, your return value would be much longer. If it were greater than 1024 then you'd get undefined behavior.

Strings as char arrays must be delimited with 0. Otherwise there's no telling where they end. You could alternatively say that the string ends at its zeroth character by explicitly setting it to 0;

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

Or you could initialize your whole array with 0's

char dest[1024] = {};

And since your question is tagged C++ I cannot but note that in C++ we use std::strings which save you from a lot of headache. Operator + can be used to concatenate two std::strings

Sign up to request clarification or add additional context in comments.

6 Comments

It's undefined behavior, period.
what is the difference by initializing char dest[1020] = ""; or char dest[1020] = {0}; as pointed by linuxuser27 above
@James: Technically, yes, but practically, on all implementations I know of, if it so happened that one of the characters were zero, nothing worse than wrong results would happen. But in any case, I agree that it's UB anyway
@user945511: both char dest[1020] = {0} and char dest[1020] = {}; set ALL characters to 0. char dest[1020] = "" sets just the first.
@ArmenTsirunyan: char dest[1020]="" would also set all characters to 0 according to the new standard that just came out, though not clearly stated in the previous standard in 2003.
|
4

Don't use char[]. If you write:

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

, you'll have no problems. (In fact, your problem is due to the fact that strcat requires a '\0' terminated string as its first argument, and you're giving it random data. Which is undefined behavior.)

5 Comments

You can use char[], but then you need to tag the question as C, not as C++ ;)
i cannot use std::string because im dealing with characters
@user945511: Huh? You can index a string with [] just like char[]
@TristramGräbener You can use char[] in C++ too. It just makes your life a lot harder. I'd consider it something reserved for the experts, working in low-level close to the hardware code.
@JamesKanze it was just a joke. Of course you can. And in some extremely weird situations it might even be better.
1

your dest array isn't initialized. so strcat tries to append source to the end of dest wich is determined by a trailing '\0' character, but it's undefined where an uninitialized array might end... (if it does at all...)

so you end up printing more or less random characters until accidentially a '\0' character occurs...

Comments

0

Try this

#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;
}

Did using VS 2010 Express. clear memory using memset as soon as you declare dest, it's more secure. Also if you are using VC++, use strcat_s() instead of strcat().

1 Comment

Clearing memory with memset is more secure than initializing with = {}; ? oO

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.