Wie verkette ich zwei Strings in C?

Lesezeit: 7 Minuten

Benutzeravatar von Levi H
Levi H

Wie addiere ich zwei Strings?

Ich habe es versucht name = "derp" + "herp";aber ich habe einen Fehler:

Der Ausdruck muss vom Typ Ganzzahl oder Aufzählung sein

Benutzeravatar von David Heffernan
David Heffernan

C hat nicht die Unterstützung für Zeichenfolgen, die einige andere Sprachen haben. Ein String in C ist nur ein Zeiger auf ein Array von char die durch das erste Nullzeichen abgeschlossen wird. In C gibt es keinen String-Verkettungsoperator.

Verwenden strcat zwei Strings zu verketten. Sie könnten dazu die folgende Funktion verwenden:

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

char* concat(const char *s1, const char *s2)
{
    char *result = malloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator
    // in real code you would check for errors in malloc here
    strcpy(result, s1);
    strcat(result, s2);
    return result;
}

Dies ist nicht der schnellste Weg, aber darüber sollten Sie sich jetzt keine Gedanken machen. Beachten Sie, dass die Funktion einen Block mit Heap-zugewiesenem Speicher an den Aufrufer zurückgibt und den Besitz dieses Speichers weitergibt. Es liegt in der Verantwortung des Anrufers free den Speicher, wenn er nicht mehr benötigt wird.

Rufen Sie die Funktion so auf:

char* s = concat("derp", "herp");
// do things with s
free(s); // deallocate the string

Wenn Sie die Leistung gestört hat, sollten Sie es vermeiden, die Eingabepuffer wiederholt nach dem Nullterminator zu durchsuchen.

char* concat(const char *s1, const char *s2)
{
    const size_t len1 = strlen(s1);
    const size_t len2 = strlen(s2);
    char *result = malloc(len1 + len2 + 1); // +1 for the null-terminator
    // in real code you would check for errors in malloc here
    memcpy(result, s1, len1);
    memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator
    return result;
}

Wenn Sie vorhaben, viel mit Strings zu arbeiten, ist es vielleicht besser, eine andere Sprache zu verwenden, die erstklassige Unterstützung für Strings bietet.

  • Kleines Bit: Code könnte die Kopie des ersten Teils der Zeichenfolge zuletzt und dann machen return memcpy(result, s1, len1);. Obwohl es sich um eine Mikrooptimierung oder zumindest ein bisschen Code-Golfing handelt, können solche potenziellen Verbesserungen an grundlegenden Zeichenfolgenoperationen angesichts ihrer hohen Nutzung einen Wert haben.

    – chux – Wiedereinsetzung von Monica

    9. November 2016 um 19:29 Uhr


  • Kleine Leistungsverbesserung der ersten Version mit stpcpydie einen Zeiger auf das Ende der ersten Zeichenfolge zurückgibt: strcpy(stpcpy(result, s1), s2);

    – Daniel

    29. Mai 2020 um 8:26 Uhr


  • @Daniel meinst du strcat(stpcpy(result, s1), s2); ?

    – YoussefDir

    27. September um 8:45 Uhr

  • @YoussefDir nein tut er nicht

    – David Heffernan

    27. September um 16:47 Uhr

  • @YoussefDir Ich habe Ihre vorgeschlagene Änderung abgelehnt. Der Compilerfehler, den Sie gesehen haben, war darauf zurückzuführen, dass Sie mit einem C++-Compiler kompilieren, aber dies ist eine C-Frage.

    – David Heffernan

    27. September um 16:49 Uhr

#include <stdio.h>

int main(){
    char name[] =  "derp" "herp";
    printf("\"%s\"\n", name);//"derpherp"
    return 0;
}

  • Es funktioniert auch für Makros in c, was erwähnenswert ist

    – Abe Fehr

    3. Dezember 2013 um 17:00 Uhr

Benutzeravatar von mmdemirbas
mmdemirbas

David Heffernan erklärte das Problem in seiner Antwort, und ich schrieb den verbesserten Code. Siehe unten.

Eine generische Funktion

Wir können eine nützliche schreiben variadische Funktion um eine beliebige Anzahl von Zeichenfolgen zu verketten:

#include <stdlib.h>       // calloc
#include <stdarg.h>       // va_*
#include <string.h>       // strlen, strcpy

char* concat(int count, ...)
{
    va_list ap;
    int i;

    // Find required length to store merged string
    int len = 1; // room for NULL
    va_start(ap, count);
    for(i=0 ; i<count ; i++)
        len += strlen(va_arg(ap, char*));
    va_end(ap);

    // Allocate memory to concat strings
    char *merged = calloc(sizeof(char),len);
    int null_pos = 0;

    // Actually concatenate strings
    va_start(ap, count);
    for(i=0 ; i<count ; i++)
    {
        char *s = va_arg(ap, char*);
        strcpy(merged+null_pos, s);
        null_pos += strlen(s);
    }
    va_end(ap);

    return merged;
}

Verwendungszweck

#include <stdio.h>        // printf

void println(char *line)
{
    printf("%s\n", line);
}

int main(int argc, char* argv[])
{
    char *str;

    str = concat(0);             println(str); free(str);
    str = concat(1,"a");         println(str); free(str);
    str = concat(2,"a","b");     println(str); free(str);
    str = concat(3,"a","b","c"); println(str); free(str);

    return 0;
}

Ausgabe:

  // Empty line
a
ab
abc

Aufräumen

Beachten Sie, dass Sie den zugewiesenen Speicher freigeben sollten, wenn er nicht mehr benötigt wird, um Speicherlecks zu vermeiden:

char *str = concat(2,"a","b");
println(str);
free(str);

  • Die Argumente für calloc sind rückständig. Sie sollten dann die Größe zählen. Dank der multiplikativen Identität kommen Sie hier damit durch, da sizeof(char) als 1 definiert ist.

    – Andy

    3. November 2014 um 8:51 Uhr

  • In Betracht ziehen int len –> size_t len wie size_t ist der richtige Typ für “Size”-Code. Ebenfalls // room for NULL –> // room for null character NULL impliziert den Nullzeiger.

    – chux – Wiedereinsetzung von Monica

    9. November 2016 um 19:36 Uhr

Ich nehme an, Sie brauchen es für einmalige Dinge. Ich nehme an, Sie sind ein PC-Entwickler.

Benutze den Stapel, Luke. Verwenden Sie es überall. Verwenden Sie malloc / free nicht für kleine Allokationen, je.

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

#define STR_SIZE 10000

int main()
{
  char s1[] = "oppa";
  char s2[] = "gangnam";
  char s3[] = "style";

  {
    char result[STR_SIZE] = {0};
    snprintf(result, sizeof(result), "%s %s %s", s1, s2, s3);
    printf("%s\n", result);
  }
}

Wenn 10 KB pro String nicht ausreichen, fügen Sie der Größe eine Null hinzu und stören Sie sich nicht, – sie geben ihren Stack-Speicher sowieso am Ende der Bereiche frei.

Du solltest benutzen strcatoder besser, strncat. Google es (das Schlüsselwort ist “Verketten”).

  • In acht nehmen: strncat() ist eine teuflisch schwierige Funktion, die richtig zu verwenden ist. Schnell, ohne ins Handbuch zu schauen, welche Länge gibst Du dazu an strncat()? Wenn Sie “die Länge des Puffers” gesagt haben, haben Sie meinen Standpunkt gut demonstriert. Es hat eine kontraintuitive Benutzeroberfläche, und wenn Sie über genügend Daten verfügen, um es sicher zu verwenden, müssen Sie die Funktion gar nicht erst verwenden – es gibt andere, schnellere und effizientere Alternativen (z strcpy() oder memmove()), die stattdessen verwendet werden könnten. Was auch immer die Frage ist, “was soll ich verwenden”, strncat() ist nicht die Antwort.

    – Jonathan Leffler

    2. Dezember 2015 um 3:00 Uhr


Benutzeravatar von Mahesh
Mahesh

Sie können solche String-Literale in C nicht hinzufügen. Sie müssen einen Puffer der Größe erstellen String-Literal eins + String-Literal zwei + ein Byte für das Null-Terminierungszeichen und kopieren Sie die entsprechenden Literale in diesen Puffer und stellen Sie außerdem sicher, dass er nullterminiert ist. Oder Sie können Bibliotheksfunktionen wie verwenden strcat.

  • In acht nehmen: strncat() ist eine teuflisch schwierige Funktion, die richtig zu verwenden ist. Schnell, ohne ins Handbuch zu schauen, welche Länge gibst Du dazu an strncat()? Wenn Sie “die Länge des Puffers” gesagt haben, haben Sie meinen Standpunkt gut demonstriert. Es hat eine kontraintuitive Benutzeroberfläche, und wenn Sie über genügend Daten verfügen, um es sicher zu verwenden, müssen Sie die Funktion gar nicht erst verwenden – es gibt andere, schnellere und effizientere Alternativen (z strcpy() oder memmove()), die stattdessen verwendet werden könnten. Was auch immer die Frage ist, “was soll ich verwenden”, strncat() ist nicht die Antwort.

    – Jonathan Leffler

    2. Dezember 2015 um 3:00 Uhr


Benutzeravatar von Paurav Shah
Paurav Schah

Strings verketten

Das Verketten zweier beliebiger Zeichenfolgen in C kann auf mindestens drei Arten erfolgen: –

1) Durch Kopieren von String 2 an das Ende von String 1

#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
  char str1[MAX],str2[MAX];
  int i,j=0;
  printf("Input string 1: ");
  gets(str1);
  printf("\nInput string 2: ");
  gets(str2);
  for(i=strlen(str1);str2[j]!='\0';i++)  //Copying string 2 to the end of string 1
  {
     str1[i]=str2[j];
     j++;
  }
  str1[i]='\0';
  printf("\nConcatenated string: ");
  puts(str1);
  return 0;
}

2) Durch Kopieren von String 1 und String 2 auf String 3

#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
  char str1[MAX],str2[MAX],str3[MAX];
  int i,j=0,count=0;
  printf("Input string 1: ");
  gets(str1);
  printf("\nInput string 2: ");
  gets(str2);
  for(i=0;str1[i]!='\0';i++)          //Copying string 1 to string 3
  {
    str3[i]=str1[i];
    count++;
  }
  for(i=count;str2[j]!='\0';i++)     //Copying string 2 to the end of string 3
  {
    str3[i]=str2[j];
    j++;
  }
  str3[i]='\0';
  printf("\nConcatenated string : ");
  puts(str3);
  return 0;
}

3) Durch die Verwendung der Funktion strcat()

#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
  char str1[MAX],str2[MAX];
  printf("Input string 1: ");
  gets(str1);
  printf("\nInput string 2: ");
  gets(str2);
  strcat(str1,str2);                    //strcat() function
  printf("\nConcatenated string : ");
  puts(str1);
  return 0;
}

1424990cookie-checkWie verkette ich zwei Strings in C?

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

Privacy policy