Verketten Sie ein Char-Array in C

Lesezeit: 2 Minuten

Benutzeravatar von user69514
Benutzer69514

Ich habe ein Char-Array:

char* name = "hello";

Ich möchte diesem Namen eine Erweiterung hinzufügen, um ihn zu erstellen

hello.txt

Wie kann ich das machen?

name += ".txt" wird nicht funktionieren

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

    – Werden

    7. Februar 2010 um 21:03 Uhr

Benutzeravatar von David Underhill
David Unterhill

Schauen Sie sich die an strcat Funktion.

Insbesondere könnten Sie Folgendes 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 */
...
free(name_with_extension);

  • Vergessen Sie nicht, name_with_extension freizugeben!

    – Nick Presta

    7. Februar 2010 um 21:04 Uhr

  • Kannst du bitte schreiben const char *name, *extension? Ein Zeichenfolgenliteral ist nicht a char *.

    – vergänglich

    7. Februar 2010 um 22:03 Uhr

  • Ein bisschen neu in C, aber was hat es mit dem +1+4 in malloc(strlen(name)+1+4) auf sich? Ich vermute, das +4 sind die 4 zusätzlichen Zeichen, aber was ist das +1?

    – Jackie

    3. Juni 2013 um 20:38 Uhr

  • Das +1 soll das Null-Terminator am Ende der Zeichenfolge berücksichtigen

    – schief98

    15. Oktober 2013 um 1:10 Uhr

  • @ loppped98 warum nicht sizeof(char) diese tatsächliche Byteanzahl verwendet? z.B malloc(strlen(name) + 4 * sizeof(char) + 1)

    – Joseph Persie III

    3. Januar 2017 um 13:47 Uhr

Benutzeravatar von mctylr
mctylr

Ich habe ein Char-Array:

char* name = "hello";

Nein, Sie haben einen Zeichenzeiger auf a String-Literal. In vielen Verwendungen könnten Sie den const-Modifikator hinzufügen, je nachdem, ob Sie mehr an was interessiert sind Name zeigt auf oder den Zeichenfolgenwert “hallo“. Sie sollten nicht versuchen, das Literal (“Hallo”) zu ändern, weil es können schlimme dinge passieren.

Das Wichtigste, was zu vermitteln ist, ist, dass C kein richtiges (oder erste Klasse) String-Typ. “Strings” sind normalerweise Arrays von Zeichen (Zeichen) mit einem abschließenden Nullzeichen (‘\0’ oder Dezimal 0), um das Ende eines Strings anzuzeigen, oder Zeiger auf Arrays von Zeichen.

Ich würde vorschlagen zu lesen Zeichen-ArraysAbschnitt 1,9 Zoll Die Programmiersprache C (Seite 28 zweite Auflage). Ich empfehle dringend, dieses kleine Buch (<300 Seiten) zu lesen, um C zu lernen.

Ergänzend zu Ihrer Frage, Abschnitte 6 – Arrays und Zeiger und Abschnitt 8 – Zeichen und Zeichenketten des C-Häufig gestellte Fragen könnte helfen. Frage 6.5und 8.4 könnten gute Ausgangspunkte sein.

Ich hoffe, das hilft Ihnen zu verstehen, warum Ihr Auszug nicht funktioniert. Andere haben skizziert, welche Änderungen erforderlich sind, damit es funktioniert. Grundsätzlich benötigen Sie ein Char-Array (ein Array von Zeichen), das groß genug ist, um die gesamte Zeichenfolge mit einem abschließenden (endenden) ‘\0’-Zeichen zu speichern. Dann können Sie die Standard-C-Bibliotheksfunktion strcpy (oder noch besser strncpy) verwenden, um das “Hello” hineinzukopieren, und dann möchten Sie mit der Standard-C-Bibliotheksfunktion strcat (oder noch besser strncat) verketten. Sie sollten die Header-Datei string.h einschließen, um die Funktionsdeklarationen 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;
}

  • Dies ist eine bessere Lösung als die vom OP ausgewählte: Es verwendet kein malloc (im Stack zugewiesener Speicher wird neu zugewiesen, nachdem die Routine ausgeführt wurde) und es verfügt über viele gute Fehlerprüfungen.

    – Casey

    3. März 2019 um 0:10 Uhr


  • @nmnir Du hast genau recht. Ich habe versucht zu sagen, dass die vom OP ausgewählte Antwort malloc nicht ideal ist, teilweise weil sie Speicher auf dem Heap verwendet. Im Gegensatz dazu ist diese Antwort besser, da malloc nicht verwendet wird und daher der Speicher auf dem Stapel zugewiesen und nach Ausführung der Routine neu zugewiesen wird. Meine Verwendung von Klammern war mehrdeutig und es ist zu spät, sie zu bearbeiten. Betrachten Sie diesen Kommentar als Klarstellung.

    – Casey

    30. Dezember 2020 um 19:18 Uhr


Benutzeravatar von Salv0
Salv0

Kopieren Sie zuerst den aktuellen String in ein größeres Array mit strcpydann benutze strcat.

Zum Beispiel können Sie Folgendes tun:

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

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

asprintf ist nicht 100% Standard, aber es ist über die GNU- und BSD-Standard-C-Bibliotheken verfügbar, also haben Sie es wahrscheinlich. Es weist die Ausgabe zu, sodass Sie nicht herumsitzen und Zeichen zählen müssen.

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

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

Sie können Zeichenfolgen mit der Funktion sprintf() verketten. In Ihrem Fall zum Beispiel:

char file[80];
sprintf(file,"%s%s",name,extension);

Und am Ende haben Sie die verkettete Zeichenfolge in “Datei”.

in seltenen Fällen, wenn Sie nicht verwenden können strncat, strcat oder strcpy. Und du keinen Zugriff haben zu <string.h> also kannst du nicht verwenden strlen. Außerdem kennen Sie vielleicht nicht einmal die Größe der Char-Arrays und möchten trotzdem verketten, weil Sie nur Zeiger haben. Nun, Sie können die alte Schule machen malloc und zähle selbst zeichen wie..

char *combineStrings(char* inputA, char* inputB) {
    size_t len = 0, lenB = 0;
    while(inputA[len] != '\0') len++;
    while(inputB[lenB] != '\0') lenB++;
    char* output = malloc(len+lenB);
    sprintf((char*)output,"%s%s",inputA,inputB);
    return output;
}

Es braucht nur #include <stdio.h> die Sie höchstwahrscheinlich bereits enthalten haben

Benutzeravatar von DigitalRoss
DigitalRoss

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

1411680cookie-checkVerketten Sie ein Char-Array in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy