22 Stimmen

C String-Verkettung von Konstanten

Eine der Antworten a Warum verwenden Sie nicht C für Ihre Webanwendungen? enthält die folgenden Informationen:

Für das unten stehende C-Crap-Beispiel:

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

Eigentlich 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 wenn Sie [] statt * verwenden, können Sie sogar die Zeichenkette ä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, erhalte aber eine Fehlermeldung:

erwartetes ',' 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 ich andere Möglichkeiten zur Verkettung von Zeichenarrays in C kenne.

44voto

Lundin Punkte 171916

(char*)malloc

Typisieren Sie niemals das Ergebnis von malloc in C. Lesen y .

Eigentlich KÖNNEN UND SOLLTEN Konstanten in C natürlich verkettet werden

Nein, String-Literale können und sollten in C verkettet werden. "foo" ist ein String-Literal und const char foo[] ist eine konstante Zeichenfolge (Array von Zeichen). Der Code "foo" "bar" wird automatisch verkettet, der Code foo bar wird nicht.

Wenn Sie wollen, können Sie die Stringliterale 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 bei Zeichenketten eher schwierig zu verwenden, wie wir an diesem Beispiel sehen können. Trotz ihres arroganten Selbstbewusstseins hat die Person, die es geschrieben hat, die verschiedenen Konzepte durcheinander gebracht und muss noch lernen, wie man C benutzt.

8voto

geekosaur Punkte 55917

Diese Antwort sieht so aus, als ob es jemandem gelungen ist, String-Literale, die auf diese Weise verkettet werden können, mit const String-Variablen. Ich vermute, dass das Original Präprozessor-Makros anstelle von Variablen hatte.

-1voto

Raiz Punkte 1
#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 y str2 ohne die Notwendigkeit von malloc sollte die Ausgabe lauten:

foo
bar
foobar

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X