C-String anhängen

Lesezeit: 4 Minuten

Benutzeravatar von Udara SS Liyanage
Udara SS Liyanage

Ich möchte zwei Strings anhängen. Ich habe den folgenden Befehl verwendet:

new_str = strcat(str1, str2);

Dieser Befehl ändert den Wert von str1. Ich will new_str die Verkettung von sein str1 und str2 und gleichzeitig str1 ist nicht zu ändern.

  • Du hast recht, das tut es.

    – Charly Martin

    5. Mai 2011 um 16:35 Uhr

  • Aus verschiedenen Gründen möchten Sie vielleicht die Größen von im Auge behalten str1, str2und new_strund verwenden strncat statt nur strcat). Es hilft, einige Pufferüberlauffehler zu vermeiden.

    – Brendan Lang

    5. Mai 2011 um 16:38 Uhr

Benutzeravatar von Charlie Martin
Charly Martin

Sie müssen auch neuen Speicherplatz zuweisen. Betrachten Sie dieses Codefragment:

char * new_str ;
if((new_str = malloc(strlen(str1)+strlen(str2)+1)) != NULL){
    new_str[0] = '\0';   // ensures the memory is an empty string
    strcat(new_str,str1);
    strcat(new_str,str2);
} else {
    fprintf(STDERR,"malloc failed!\n");
    // exit?
}

Vielleicht möchten Sie darüber nachdenken strnlen(3) was etwas sicherer ist.

Aktualisiert, siehe oben. In einigen Versionen der C-Laufzeitumgebung wird der Arbeitsspeicher von zurückgegeben malloc nicht auf 0 initialisiert. Setzen des ersten Bytes von new_str auf Null stellt sicher, dass es für strcat wie ein leerer String aussieht.

  • malloc kann immer Müll zurückgeben, und das tut es sogar auf modernen Systemen. calloc gibt Ihnen null Speicher.

    – Körnel

    22. Dezember 2012 um 23:32 Uhr

  • Und calloc nimmt sich auch oft Zeit dafür. Wenn Sie viele Zeichenfolgen erstellen und vorsichtig mit Ihren Zeigern umgehen, können Sie viele redundante Anweisungen einsparen.

    – Charly Martin

    24. Dezember 2012 um 4:01 Uhr

  • Bitte entfernen Sie die falsche Vermutung: “Ich glaube, die neuere C-Spezifikation erfordert tatsächlich malloc, dies zu tun”. Wenn Sie das erste Byte auf Null setzen, wird es per Definition zu einer Zeichenfolge mit der Länge Null (sieht nicht so aus).

    – Michael Labbe

    24. Mai 2016 um 6:07 Uhr

  • Macht das Erinnerung wie ein leerer String aussehen. Der von malloc zurückgegebene Speicher, auf den von a verwiesen wird void *ist nichts – per Definition.

    – Charly Martin

    24. Mai 2016 um 13:24 Uhr

Benutzeravatar von VirtualTroll
VirtualTroll

Mach Folgendes:

strcat(new_str,str1);
strcat(new_str,str2);

  • Mit der Einschränkung, dass new_str mit einem leeren String initialisiert werden muss.

    – individuell

    5. Mai 2011 um 16:38 Uhr

  • Dies stürzt ab, wenn new_str das Leerzeichen oder (*new_str) != 0 nicht halten kann

    – Michael Labbe

    24. Mai 2016 um 5:59 Uhr

  • Dies gibt mir immer wieder “Segmentierungsfehler”

    – Sarah

    13. September 2020 um 17:47 Uhr

Erwägen Sie die Verwendung der großartigen, aber unbekannten Funktion open_memstream().

FILE *open_memstream(char **ptr, size_t *sizeloc);

Anwendungsbeispiel:

// open the stream
FILE *stream;
char *buf;
size_t len;
stream = open_memstream(&buf, &len);

// write what you want with fprintf() into the stream
fprintf(stream, "Hello");
fprintf(stream, " ");
fprintf(stream, "%s\n", "world");

// close the stream, the buffer is allocated and the size is set !
fclose(stream);
printf ("the result is '%s' (%d characters)\n", buf, len);
free(buf);

Wenn Sie nicht im Voraus wissen, wie lang das ist, was Sie anhängen möchten, ist dies bequemer und sicherer, als Puffer selbst zu verwalten.

  • Es ist erwähnenswert open_memstream ist Teil von POSIX, nicht des ISO-C-Standards. Es ist daher nicht auf Nicht-Unix-Systemen wie Windows verfügbar, und nicht einmal auf allen Unix-Systemen. strcat ist eine portablere Lösung.

    – Denis Washington

    30. Dezember 2021 um 10:46 Uhr

Benutzeravatar von Joel Falcou
Joel Falkou

Du musst strncpy str1 hinein new_string Zuerst, dann.

Du könntest benutzen asprintf um beide zu einer neuen Zeichenfolge zu verketten:

char *new_str;
asprintf(&new_str,"%s%s",str1,str2);

  • Dies ist von Natur aus spezifisch für Plattformen, auf denen asnprintf ist aber vorhanden. Es ist nicht “Standard”.

    – László Papp

    3. Dezember 2014 um 11:39 Uhr

Weis Benutzeravatar
Wei

Ich schreibe eine Funktion, die dynamisches Variablen-String-Anhängen unterstützt, wie PHP str append: str + str + … usw.

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

int str_append(char **json, const char *format, ...)
{
    char *str = NULL;
    char *old_json = NULL, *new_json = NULL;

    va_list arg_ptr;
    va_start(arg_ptr, format);
    vasprintf(&str, format, arg_ptr);

    // save old json
    asprintf(&old_json, "%s", (*json == NULL ? "" : *json));

    // calloc new json memory
    new_json = (char *)calloc(strlen(old_json) + strlen(str) + 1, sizeof(char));

    strcat(new_json, old_json);
    strcat(new_json, str);

    if (*json) free(*json);
    *json = new_json;

    free(old_json);
    free(str);

    return 0;
}

int main(int argc, char *argv[])
{
    char *json = NULL;

    str_append(&json, "name: %d, %d, %d", 1, 2, 3);
    str_append(&json, "sex: %s", "male");
    str_append(&json, "end");
    str_append(&json, "");
    str_append(&json, "{\"ret\":true}");

    int i;
    for (i = 0; i < 10; i++) {
        str_append(&json, "id-%d", i);
    }

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

    if (json) free(json);

    return 0;
}

  • Dies ist von Natur aus spezifisch für Plattformen, auf denen asnprintf ist aber vorhanden. Es ist nicht “Standard”.

    – László Papp

    3. Dezember 2014 um 11:39 Uhr

Benutzeravatar von Zac
Zac

Ich musste Teilzeichenfolgen anhängen, um einen ssh-Befehl zu erstellen, mit dem ich gelöst habe sprintf (Visual Studio 2013)

char gStrSshCommand[SSH_COMMAND_MAX_LEN]; // declare ssh command string

strcpy(gStrSshCommand, ""); // empty string

void appendSshCommand(const char *substring) // append substring
{
  sprintf(gStrSshCommand, "%s %s", gStrSshCommand, substring);
}

1411120cookie-checkC-String anhängen

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

Privacy policy