user3180902
user3180902

Reputation:

why the string is getting altered after strcat()?

this is the source code

int main()
{
    char str[]="dance";
    char str1[]="hello";
    char str2[]="abcd";
    strcat(str1,str2);
    printf("%s",str);
}

output- bcd

why str is changed after strcat(str1,str2);

Upvotes: 0

Views: 1248

Answers (4)

haccks
haccks

Reputation: 105992

str1 has not enough space to concatenate the string str2. This invokes undefined behavior. You may get anything. Either expected or unexpected result.
Now try this:

#include <stdio.h>
#include <string.h> 

int main(void) {
    char str[]="dance";
    char str1[10]="hello";
    char str2[]="abcd";
    strcat(str1,str2);
    printf("%s\n",str1);
    printf("%s\n",str);

    return 0;
}  

Output:

helloabcd
dance

Upvotes: 5

M Oehm
M Oehm

Reputation: 29116

You are concatenating str2 to str1, but str1 is not big enough to hold both strings. There is a buffer overflow that corrupts the contents of the third string on the stack, str.

When you define

char str1[] = "hello";

you create an array of six chars, 5 for "hello" plus one null character to terminate the string. The string is already full, so to speak. A quick fix is to specify an array size:

char str1[20] = "hello";

Now you should be able to append str2 to str1 with strcat.

In practice, you should ensure that the buffer is big enough to hold the whole string:

char buf[20];

if (strlen(str1) + strlen(str2) < 20) {
    strcpy(buf, str1);
    strcat(buf, str2);
}

This is tedious. There is another way to concatenate strings without buffer overflow:

char buf[20];
int n;

n = snprintf(buf, 20, "%s%s", str1, str2);

This might cut the whole string short, but will not overflow the buffer. The return value n tells how many characters would have been written, had there been enough space, so you can use it to check.

Upvotes: 0

Jonatan Goebel
Jonatan Goebel

Reputation: 1139

This is a "Undefined behavior"

str, str1, str2 have a limited size, and they are putted in the stack, the sequence depends on the compiler. You probably have something like this in your stack.

['a']['b']['c']['d']['\0']['h']['e']['l']['l']['o']['\0']['d']['a']['n']['c']['e']['\0']

Got it?

When you writes after the initial size of str1, you are overriding the stack, an changing all others variable that are on the stack.

Upvotes: 0

user3180902
user3180902

Reputation:

I got it...

as I have not given the size of str1 , both str1 and str are present in the memory one after another

like

h e l l o \0 d a n c e

so when I concatenate str1 and str2 following thing happens...

a replaces \0
b replaces d
c replaces a
d replaces n
\0 replaces c

and hence str is altered

Upvotes: 2

Related Questions