Concatenar dos cadenas char * en un progtwig en C

Escribí el siguiente progtwig en C:

int main(int argc, char** argv) { char* str1; char* str2; str1 = "sssss"; str2 = "kkkk"; printf("%s", strcat(str1, str2)); return (EXIT_SUCCESS); } 

Quiero concatenar las dos cadenas, pero no funciona.

La forma en que funciona es:

  1. Memoria Malloc lo suficientemente grande como para contener copias de str1 y str2.
  2. Luego copia str1 en str3
  3. Luego agrega str2 al final de str3
  4. Cuando estás usando str3, normalmente lo free (str3);

Aquí hay un ejemplo para que juegues. Es muy simple y no tiene longitudes rígidas. Puedes probarlo aquí: http://ideone.com/d3g1xs

Ver esta publicación para obtener información sobre el tamaño de char

 #include  #include  int main(int argc, char** argv) { char* str1; char* str2; str1 = "sssss"; str2 = "kkkk"; char * str3 = (char *) malloc(1 + strlen(str1)+ strlen(str2) ); strcpy(str3, str1); strcat(str3, str2); printf("%s", str3); return 0; } 

Aquí hay una solución de trabajo:

 #include  #include  int main(int argc, char** argv) { char str1[16]; char str2[16]; strcpy(str1, "sssss"); strcpy(str2, "kkkk"); strcat(str1, str2); printf("%s", str1); return 0; } 

Salida:

 ssssskkkk 

Tienes que asignar memoria para tus cadenas. En el código anterior, declaro str1 y str2 como matrices de caracteres que contienen 16 caracteres. Utilicé strcpy para copiar caracteres de literales de cadena en ellos, y strcat para agregar los caracteres de str2 al final de str1 . Aquí es cómo se ven estas matrices de caracteres durante la ejecución del progtwig:

 After declaration (both are empty): str1: [][][][][][][][][][][][][][][][][][][][] str2: [][][][][][][][][][][][][][][][][][][][] After calling strcpy (\0 is the string terminator zero byte): str1: [s][s][s][s][s][\0][][][][][][][][][][][][][][] str2: [k][k][k][k][\0][][][][][][][][][][][][][][][] After calling strcat: str1: [s][s][s][s][s][k][k][k][k][\0][][][][][][][][][][] str2: [k][k][k][k][\0][][][][][][][][][][][][][][][] 

strcat concats str2 en str1

Obtendrá errores de tiempo de ejecución porque str1 no se está asignando correctamente para la concatenación

Cuando utiliza literales de cadena, como "this is a string" y en su caso "sssss" y "kkkk" , el comstackdor los coloca en la memoria de solo lectura. Sin embargo, strcat intenta escribir el segundo argumento después del primero. Puedes resolver este problema creando un búfer de destino de tamaño suficiente y escribiéndolo.

 char destination[10]; // 5 times s, 4 times k, one zero-terminator char* str1; char* str2; str1 = "sssss"; str2 = "kkkk"; strcpy(destination, str1); printf("%s",strcat(destination,str2)); 

Tenga en cuenta que en los comstackdores recientes, normalmente recibe una advertencia para convertir literales de cadena en punteros de caracteres no constantes.

strcat(str1, str2) agrega str2 después de str1. Requiere que str1 tenga suficiente espacio para mantener str2. En su código, str1 y str2 son todas constantes de cadena, por lo que no debería funcionar. Puedes intentar de esta manera:

 char str1[1024]; char *str2 = "kkkk"; strcpy(str1, "ssssss"); strcat(str1, str2); printf("%s", str1); 

strcat intenta añadir el segundo parámetro al primero. Esto no funcionará ya que está asignando cadenas constantes de tamaño implícito.

Si todo lo que quieres hacer es imprimir dos cadenas

 printf("%s%s",str1,str2); 

Haría.

Podrías hacer algo como

 char *str1 = calloc(sizeof("SSSS")+sizeof("KKKK")+1,sizeof *str1); strcpy(str1,"SSSS"); strcat(str1,str2); 

para crear una cadena concatenada; sin embargo, considere utilizar strncat / strncpy en su lugar. Y lea atentamente las páginas del manual para lo anterior. (Ah, y no te olvides de free str1 al final).