C-String-Verkettung von Konstanten

Lesezeit: 3 Minuten

Benutzer-Avatar
Frank Vilea

Eine der Antworten auf Warum verwenden Sie C nicht für Ihre Web-Apps? enthält folgendes:

Für das C-Mist-Beispiel unten:

const char* foo = "foo";
const char* bar = "bar";
char* foobar = (char*)malloc(strlen(foo)+strlen(bar)+1);
strcpy(foobar, foo);
strcat(foobar, foo);

Tatsächlich KÖNNEN UND SOLLTEN Konstanten in C natürlich verkettet werden:

const char foo[] = "foo";
const char bar[] = "bar";
char foobar[] = foo bar; // look Ma, I did it without any operator!

Und verwenden [] Anstelle von * können Sie sogar die Zeichenfolge ändern oder ihre Länge ermitteln:

int foo_str_len = sizeof(foobar)-1;

Also, BITTE, bevor Sie (fälschlicherweise) behaupten, dass C schwierig mit Strings zu verwenden ist, lernen Sie, wie man C verwendet.


Ich habe es selbst versucht, bekomme aber eine Fehlermeldung:

erwartet ‘,’ oder ‘;’ vor String-Konstante

Meine Frage ist also: Muss ich dem Compiler etwas mitteilen, damit dies funktioniert, oder ist der obige Beitrag einfach falsch? Bitte beachten Sie, dass mir andere Möglichkeiten zum Verketten von Zeichenarrays in C bekannt sind.

  • Diese Antwort ist Unsinn.

    – Oliver Charlesworth

    24. April 2012 um 9:59 Uhr

Benutzer-Avatar
Lundin

(char*)malloc

Niemals das Ergebnis von malloc in C umwandeln. Lesen Dies und das.

Tatsächlich KÖNNEN UND SOLLTEN Konstanten in C auf natürliche Weise verkettet werden

Nein, Zeichenfolgenliterale kann und sollte in C verkettet werden. "foo" ist ein Zeichenfolgenliteral und const char foo[] ist eine konstante Zeichenfolge (Array von Zeichen). Der Code "foo" "bar" wird der Code automatisch verkettet foo bar wird nicht.

Wenn Sie möchten, können Sie die Zeichenfolgenliterale hinter Makros verstecken:

#define foo "foo"
#define bar "bar"
char foobar[] = foo bar; // actually works

Also, BITTE, bevor Sie (fälschlicherweise) behaupten, dass C schwierig mit Strings zu verwenden ist, lernen Sie, wie man C verwendet.

C ist ziemlich schwierig mit Saiten zu verwenden, wie wir an diesem Beispiel sehen können. Trotz ihrer arroganten Zuversicht hat die Person, die es geschrieben hat, die verschiedenen Konzepte durcheinander gebracht und muss noch lernen, wie man C benutzt.

  • @Lundin macht das mit "foo" bar() wo bar() gibt a zurück char *?

    – Alexej Magura

    15. Januar 2015 um 23:52 Uhr

  • @AlexejMagura Ein char* ist kein String-Literal, also nein.

    – Ludin

    16. Januar 2015 um 7:20 Uhr

Diese Antwort sieht so aus, als hätte es jemand geschafft, Zeichenfolgenliterale, die auf diese Weise verkettet werden können, mit zu verschmelzen const String-Variablen. Meine Vermutung ist, dass das Original Präprozessormakros anstelle von Variablen hatte.

Benutzer-Avatar
Raiz

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

int
main(int argc, char *argv[])
{
    char *str1 = "foo";
    char *str2 = "bar";
    char ccat[strlen(str1)+strlen(str2)+1];

    strncpy(&ccat[0], str1, strlen(str1));
    strncpy(&ccat[strlen(str1)], str2, strlen(str2));
    ccat[strlen(str1)+strlen(str2)+1] = '\0';

    puts(str1);
    puts(str2);
    puts(ccat);
}

dieser Code verkettet str1 und str2 ohne die Notwendigkeit mallocdie Ausgabe sollte sein:

foo
bar
foobar

  • Ja, ich weiß, ich habe vergessen, den Exit-Status zurückzugeben

    – Raiz

    27. Juli 2016 um 9:56 Uhr

  • Bitte, nicht schon wieder. SO ist keine Tutorial-Site.

    – Michi

    27. Juli 2016 um 10:15 Uhr

1282600cookie-checkC-String-Verkettung von Konstanten

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

Privacy policy