2016-05-07 13 views
-2

Gibt es eine Funktion, die es mir ermöglicht, eine Zeichenfolge an den Anfang einer anderen Zeichenfolge zu verketten?concat Zeichenfolge an den Anfang einer anderen Zeichenfolge

Zum Beispiel, wenn ich

str1 = "world!"; 
str2 = "Hello, "; 

Gibt es eine Möglichkeit, diese Zeichenfolgen zu einer Zeichenfolge zu kombinieren, die enthält „Hallo, Welt!“?

+1

Hast du bei 'strcat' hatte einen Blick? – SMA

Antwort

1

Es kann auf viele Arten erfolgen. Hier ist ein Ansatz, der dynamische Speicherzuweisung verwendet:

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

int main(void) 
{ 
    char* str1 = "world!"; 
    char* str2 = "Hello, "; 
    char* p = malloc(strlen(str1) + strlen(str2) + 1); // Allocate memory for the new string 
    strcpy(p, str2); // Copy str2 to the new string 
    strcat(p, str1); // Concatenate str1 
    printf("%s", p); // print it 
    free(p);   // free the allocated memory 
    return 0; 
} 

den Code Versuchen Sie es hier: http://ideone.com/oydJHN

Statt dynamische Speicherzuweisung können Sie so etwas wie verwenden:

#define LENGTH_OF_RESULT 100 

char result[LENGTH_OF_RESULT]; 

statt char* p;. Sie müssen sicherstellen, dass LENGTH_OF_RESULT groß genug ist, um die verkettete Zeichenfolge zu enthalten. Der Vorteil der dynamischen Speicherzuordnung besteht darin, dass Sie sich keine Gedanken über die Größe der Zielzeichenfolge machen müssen. Ordnen Sie einfach anhand der Länge der Eingabezeichenfolgen das, was Sie benötigen, und 1 für die Nullterminierung hinzu.

Der Nachteil der Verwendung dynamischer Speicherzuweisung ist, dass Sie sich daran erinnern müssen, free den Speicher, wenn Sie damit fertig sind.

+2

Sie haben 'stdlib.h' –

+2

Und' string.h' vergessen. –

2

Sie können dies mit statisch deklariertem Speicher tun, im Gegensatz zur dynamischen Zuweisung des Speichers, und vermeiden Sie den zusätzlichen Anruf malloc und rufen Sie free. So oder so ist in Ordnung. Ein einfaches Beispiel ist:

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

enum { MAXL = 64 }; /* constant for max concatenated length */ 

int main (void) { 

    char str1[MAXL] = "hello"; 
    char str2[MAXL] = "world"; 
    char dest[2*MAXL+1] = ""; 

    strcpy (dest, str1); 
    strcat (dest, " "); 
    strcat (dest, str2); 
    strcat (dest, "!"); 

    printf ("\n%s\n\n", dest); 

    return 0; 
} 

Beispiel Verwendung

$ ./bin/concat 

hello world! 

Der Schlüssel oder so einfach ist die Versicherung Sie ausreichend Platz in Ihren destination Zeichenfolge haben die verketteten Ergebnisse zu halten. Die Kombination von 2 - Strings mit ihrer maximalen Anzahl an Zeichen bedeutet, dass mit nur einem Trennzeichen der doppelte Speicherplatz für die vorhandenen Strings verwendet werden kann (Sie erhalten ein Zeichen zurück, indem Sie nur 1 Zeichen in der kombinierten Zeichenfolge verwenden 2 vorher). Wenn Sie zusätzliche Zeichen als Trennzeichen hinzufügen, müssen Sie diese ebenfalls zum verfügbaren Gesamtspeicher hinzufügen. Lass es mich wissen, falls du fragen hast.

+0

Warum nicht '#define MAXL 64'? –

+0

Das funktioniert auch gut. Aber ich zog aus einer Datei, die die 'enum {MAXC = 32, MAXL = 64} hatte;' also löschte ich einfach eine und behielt die andere (Faulheit ':)' –

1

Sie können Ihre eigenen function.It ist ganz einfach machen:

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

void my_strcat(char *dst, const char *src); 


int main(void) 
{ 
    char dst[50] = "world"; 
    char src[] = "hello "; 
    my_strcat(dst, src); 
    printf("%s\n", dst); 
    return 0; 
} 

void my_strcat(char *dst, const char *src) 
{ 
    size_t dst_len = strlen(dst) + 1, src_len = strlen(src); 
    memmove(dst + src_len, dst, dst_len); 
    memcpy(dst, src, src_len); 
} 
+0

Dein Code wird nicht NUL-terminiert, oder? Also, UB ... –

+0

tut es jetzt.Ich dachte NUL-beendend, aber die Deklaration wie 'char dst [50] =" string "' wird reichlich 0 lassen –

+0

Ah, ja. Das habe ich vermisst. –

Verwandte Themen