2013-08-27 13 views
8

Napisałem następujący program: CŁączy dwa ciągi char * w programie C

int main(int argc, char** argv) { 

    char* str1; 
    char* str2; 
    str1 = "sssss"; 
    str2 = "kkkk"; 
    printf("%s", strcat(str1, str2)); 

    return (EXIT_SUCCESS); 
} 

Chcę złączyć dwa ciągi, ale to nie działa.

+4

pan nie udaje się przeznaczyć bufor docelowy wystarczającej wielkości, a próby zapisu do pamięci niemodyfikowalne. –

+4

Kiedy mówisz "to nie działa?", Co masz na myśli? Co to jest drukowanie zamiast tego, co powinno? Nawet jeśli jest to dość oczywiste, powinieneś również powiedzieć, co myślisz, że ma wydrukować, aby było jasne. – qaphla

+0

zobacz to pytanie [Używanie strcat w C] (http://stackoverflow.com/questions/419604/using-strcat-in-c) – lsalamon

Odpowiedz

15

Jak to działa jest: pamięci

  1. Malloc wystarczająco duży, aby pomieścić kopie str1 i słowo2
  2. Następnie kopiuje str1 w str3
  3. Następnie dołącza sTR2 na koniec str3
  4. Kiedy używasz str3 ci, że zwykle za darmo to free (str3);

Oto przykład gry. Jest bardzo prosty i nie ma zakodowanych na stałe długości. Można spróbować tu: http://ideone.com/d3g1xs

Zobacz this post do informacji o wielkości char

#include <stdio.h> 
#include <memory.h> 

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

Jaka jest różnica między 'str3 =" sssss "' a 'strcpy (str3, str1)'? – BeCurious

+0

Str3 musi wskazywać na pamięć, która jest wystarczająco duża, aby pomieścić ciąg. Właśnie dlatego zauroczyłem go w powyższej linii. – dcaswell

+0

Ale po tym kodzie 'char * str3 = (char *) malloc (1 + sizeof (char *) * (strlen (str1) + strlen (str2)));' Dlaczego nie używać 'str3 =" sssss "', ale użyć 'strcpy (str3, str1)' zamiast? :) – BeCurious

3

strcat concats str2 na str1

Będziesz się błędy wykonawcze ponieważ str1 nie jest odpowiednio alokowane do konkatenacji

+1

W rzeczywistości 'strcat' zwraca zwarty łańcuch. –

1

strcat(str1, str2) dołącza STR2 po str1. Wymaga, aby str1 miał wystarczająco dużo miejsca na przytrzymanie str2. W twoim kodzie str1 i str2 są wszystkie stałe łańcuchowe, więc nie powinno działać. Możesz wypróbować w ten sposób:

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

strcat próbuje dołączyć drugi parametr do pierwszego. To nie zadziała, ponieważ przypisujesz stałe ciągi o niejawnych rozmiarach.

Jeśli wszystko, co chcesz zrobić, to wydrukować dwie struny odchodzący

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

zrobi.

Można zrobić coś takiego

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

stworzyć łączone ciąg; należy jednak zdecydowanie rozważyć użycie strncat/strncpy. I uważnie przeczytaj strony podręcznika dla powyższego. (no i nie zapomnij o free str1 na końcu).

+0

Jaka jest różnica między 'str1 =" ssss "' a 'strcpy (str1," ssss ")'? – BeCurious

2

Podczas korzystania z literałów łańcuchowych, takich jak "this is a string" i w twoim przypadku "sssss" i "kkkk", kompilator umieszcza je w pamięci tylko do odczytu. Jednak strcat próbuje zapisać drugi argument po pierwszym. Możesz rozwiązać ten problem, tworząc bufor docelowy o wystarczającej wielkości i napisz do niego.

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

Zauważ, że w najnowszych kompilatorach zwykle dostajesz ostrzeżenie o rzucaniu literałów ciągów znaków do nie będących stałymi znakami znaków.

+0

dzięki za doskonałą odpowiedź +1024! – BeCurious

11

Here jest roztwór roboczy:

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

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

wyjściowa:

ssssskkkk 

Musisz przydzielić pamięci dla ciągów. W powyższym kodzie deklaruję str1 i str2 jako tablice znaków zawierające 16 znaków. Użyłem strcpy, aby skopiować znaki literałów łańcuchowych do nich i strcat, aby dołączyć znaki str2 do końca .Oto, jak te tablice znakowe wyglądać w trakcie realizacji programu:

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][][][][][][][][][][][][][][][] 
+0

To działa, dziękuję za szczegółową odpowiedź! – BeCurious

+0

A + za wysiłek i przegraną! – amrith