concatenation of character arrays in c

2019-09-19 08:56发布

I am trying to concatenate 2 character arrays but when I try it does not work and my o/p console hangs and does not print anything.

   char *str[2];
   str[0] = "Hello ";
   str[1] = "World";
   strcat(str[0],str[1]);
   printf("%s\n",str[0]);

I even tried the below code which fails as well

   char *str1 = "Hello ";
   char *str2 = "World";
   strcat(str1,str2);
   printf("%s\n",str1);

Can someone explain this?

TIA.

3条回答
霸刀☆藐视天下
2楼-- · 2019-09-19 09:27
char *str1 = "Hello ";
char *str2 = "World";
strcat(str1,str2);
printf("%s\n",str1);

Here you have str1 point to a static zone of memory which may be on a read-only page and strcat tries to write in this area at the end of "Hello " string.

The strcat() function appends the src string to the dest string, overwriting the terminating null byte ('\0') at the end of dest, and then adds a terminating null byte. The strings may not overlap, and the dest string must have enough space for the result. If dest is not large enough, program behavior is unpredictable.

A way to do it is this

char str1[100] = "Hello ";
char *str2 = "World";
strcat(str1,str2);
printf("%s\n",str1);

Instead of 100 you can choose a size such that concatenation (including the final NULL character) to have place to happen.

查看更多
等我变得足够好
3楼-- · 2019-09-19 09:36

This code illustrates the problem:

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

int main(void)
{
    char *str1 = "Hello ";
    char *str2 = "World";
    char *ptr1, *ptr2;

    printf("Find the end of str1...\n");
    ptr1 = str1;
    while (ptr1[0] != '\0') {
        ptr1++;
    }
    printf("Copy str2 to the end of str1...\n");
    ptr2 = str2;
    while (ptr2[0] != '\0') {
        printf("Attempt to write to read-only memory...\n");
        ptr1[0] = ptr2[0];
        printf("We never get here.\n");
        ptr1++;
        ptr2++;
    }
    ptr2[0] = '\0';
    printf("Done.\n");
    return 0;
}

Output

Find the end of str1...
Copy str2 to the end of str1...
Attempt to write to read-only memory...
Bus error: 10
查看更多
放荡不羁爱自由
4楼-- · 2019-09-19 09:37

To concatenate two strings you either have to create a new one large enough tp contain the both source strings or the one of the strings shall be large enough to hold the second appended string.

Take into account that string literals are immutable in C (and C++). Any attempt to change a string literal results in undefined behaviour.

You could concatenate strings if one of them was stored in a character array.

For example

char str1[12] = "Hello ";
const char *str2 = "World";

strcat( str1, str2 );
puts( str1 );

Or you could create a third string.

const char *str[2];
str[0] = "Hello ";
str[1] = "World";

char *str1 = malloc( strlen( str[0] ) + strlen( str[1] ) + 1 );

strcpy( str1, str[0] );
strcat( str1, str[1] );

puts( str1 );

free( str1 );
查看更多
登录 后发表回答