2010-02-07 16 views
27

Ich habe ein ein char-Array:concatenate char-Array in C

char* name = "hello"; 

Ich möchte eine Erweiterung auf diesen Namen hinzuzufügen, um es

hello.txt 

Wie kann ich das tun?

name += ".txt" wird nicht funktionieren

Antwort

44

einen Blick auf die Funktion strcat haben.

Insbesondere könnten Sie dies versuchen:

const char* name = "hello"; 
const char* extension = ".txt"; 

char* name_with_extension; 
name_with_extension = malloc(strlen(name)+1+4); /* make space for the new string (should check the return value ...) */ 
strcpy(name_with_extension, name); /* copy name into the new var */ 
strcat(name_with_extension, extension); /* add the extension */ 
+18

Vergessen Sie nicht, name_with_extension zu löschen! –

+0

danke, das hat super funktioniert – user69514

+2

Kannst du bitte 'const char * name, * extension' schreiben? Ein String-Literal ist * nicht * ein 'char *'. – ephemient

8

Kopieren Sie die aktuelle Zeichenfolge in ein größeres Array mit strcpy, dann strcat verwenden.

Zum Beispiel können Sie tun:

char* str = "Hello"; 
char dest[12]; 

strcpy(dest, str); 
strcat(dest, ".txt"); 
5

Sie könnten eine Antwort hier kopieren und einfügen, oder könnten Sie gehen zu lesen, was unser Gastgeber Joel strcat über zu sagen hat.

+2

wirklich gute Verbindung – dubbeat

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

char *name = "hello"; 

int main(void) { 
    char *ext = ".txt"; 
    int len = strlen(name) + strlen(ext) + 1; 
    char *n2 = malloc(len); 
    char *n2a = malloc(len); 

    if (n2 == NULL || n2a == NULL) 
    abort(); 

    strlcpy(n2, name, len); 
    strlcat(n2, ext, len); 
    printf("%s\n", n2); 

    /* or for conforming C99 ... */ 
    strncpy(n2a, name, len); 
    strncat(n2a, ext, len - strlen(n2a)); 
    printf("%s\n", n2a); 

    return 0; // this exits, otherwise free n2 && n2a 
} 
14

Ich habe ein char-Array:

char* name = "hello"; 

Nein, Sie haben ein Zeichen Zeiger auf eine string literal. In vielen Anwendungen könnten Sie den const-Modifikator hinzufügen, je nachdem, ob Sie mehr daran interessiert sind, was auf verweist, oder den Zeichenfolgenwert "hallo". Sie sollten nicht versuchen, das Literal ("Hallo") zu ändern, weil bad things can happen.

Die wichtigste Sache zu vermitteln ist, dass C keine ordnungsgemäße (oder erste Klasse) Zeichenfolge-Typ hat. "Strings" sind in der Regel Arrays von Zeichen (Zeichen) mit einem abschließenden Null ('\ 0' oder Dezimal 0) Zeichen, um das Ende einer Zeichenfolge oder Zeiger auf Arrays von Zeichen zu bezeichnen.

Ich würde vorschlagen, Character Arrays, Abschnitt 1.9 in Die Programmiersprache C (Seite 28 zweite Ausgabe) zu lesen. Ich empfehle dieses kleine Buch zu lesen (< 300 Seiten), um C.

Weiteres auf Ihre Frage zu lernen, Abschnitt 6-Arrays and Pointers und Abschnitt 8 - Characters and Strings der C FAQ helfen könnte. Frage 6.5 und 8.4 könnten gute Startpunkte sein.

Ich hoffe, dass Ihnen hilft, zu verstehen, warum Ihr Auszug nicht funktioniert. Andere haben umrissen, welche Änderungen notwendig sind, damit es funktioniert. Im Grunde brauchen Sie ein Char-Array (ein Array von Zeichen), das groß genug ist, um den gesamten String mit einem abschließenden (Ende) '\ 0' Zeichen zu speichern. Dann können Sie die Standard-C-Bibliotheksfunktion strcpy (oder besser noch strncpy) verwenden, um das "Hello" hinein zu kopieren, und dann möchten Sie die Standard-C-Bibliothek strcat (oder besser noch strncat) -Funktion verketten. Sie möchten die Header-Datei string.h einschließen, um die Deklarationen der Funktionen zu deklarieren.

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

int main(int argc, char *argv[]) 
{ 
    char filename[128]; 
    char* name = "hello"; 
    char* extension = ".txt"; 

    if (sizeof(filename) < strlen(name) + 1) { /* +1 is for null character */ 
     fprintf(stderr, "Name '%s' is too long\n", name); 
     return EXIT_FAILURE; 
    } 
    strncpy(filename, name, sizeof(filename)); 

    if (sizeof(filename) < (strlen(filename) + strlen(extension) + 1)) { 
     fprintf(stderr, "Final size of filename is too long!\n"); 
     return EXIT_FAILURE; 
    } 
    strncat(filename, extension, (sizeof(filename) - strlen(filename))); 
    printf("Filename is %s\n", filename); 

    return EXIT_SUCCESS; 
} 
4

asprintf ist nicht 100% Standard, aber es ist über die GNU und BSD Standard-C-Bibliotheken zur Verfügung, so dass Sie wahrscheinlich es haben. Es weist die Ausgabe zu, so dass Sie nicht dort sitzen und Zeichen zählen müssen.

char *hi="Hello"; 
char *ext = ".txt"; 
char *cat; 

asprintf(&cat, "%s%s", hi, ext);