Kopieren eines Teils einer Zeichenfolge (Substring) in C

Lesezeit: 6 Minuten

Benutzeravatar von SuperString
SuperString

Ich habe eine Zeichenfolge:

char * someString;

Wenn ich die ersten fünf Buchstaben dieser Zeichenfolge möchte und auf setzen möchte otherStringwie würde ich es tun?

  • someString ist kein String, sondern ein Zeiger auf eine Zeichenkette. Außerdem sind Zeichen nicht unbedingt Buchstaben. Sie müssen wissen, was eine Zeichenfolge ist, bevor Sie Buchstaben verschieben können.

    Benutzer14554

    22. Januar 2010 um 1:51 Uhr

  • Je nach Bedarf ist es besser, ein char-Array der Größe 6 für otherstring (5 + ein Byte für ‘\0’) zu deklarieren. Auf diese Weise müssen Sie sich nicht um Speicherlecks kümmern, falls Sie vergessen, andere Zeichenfolgen nach der Verwendung freizugeben.

    – HierzuLernen

    22. Januar 2010 um 2:20 Uhr

  • Ich stimme dafür, diese Frage zu schließen, weil sie neuen Benutzern beibringt, wie man sie falsch stellt, selbst die Abstimmung sollte deaktiviert werden.

    – Wolf

    26. Januar 2021 um 9:04 Uhr

  • Warnung: Diese alte Frage kommt mit einer Flut von sehr schlechten Antworten, die gefährliche oder falsche/fehlerhafte Praktiken lehren. Einige lassen sich nicht einmal kompilieren. Ich rate dem Leser, diesen Beitrag zu vermeiden oder ansonsten zu der Antwort zu scrollen, die ich gerade gepostet habe. Ich empfehle auch dringend, alle schrecklichen Antworten abzulehnen, insbesondere diejenigen mit regelrechten Fehlern und Compilerfehlern.

    – Ludin

    10. März um 7:46

Benutzeravatar von pib
pib

#include <string.h>
...
char otherString[6]; // note 6, not 5, there's one there for the null terminator
...
strncpy(otherString, someString, 5);
otherString[5] = '\0'; // place the null terminator

  • Oder otherString[5] = (char)0; Wenn Sie wählerisch sein wollen. Char ist ein ganzzahliger Typ, daher werden (oder sollten) sich Compiler nicht darüber beschweren, ihm einfach eine rohe Ganzzahl zuzuweisen.

    – pib

    24. Januar 2010 um 17:47 Uhr

  • Vielen Dank, dass Sie mich daran erinnert haben, das Abschlusszeichen in einfache Anführungszeichen statt in doppelte Anführungszeichen zu setzen.

    – Möwe

    12. September 2017 um 14:49 Uhr

  • @pib Kommentar unklar. Beide otherString[5] = '\0'; und otherString[5] = 0;in C, weisen eine zu int mit einem Wert von 0 bis a char. Also wie funktioniert (char) Hilfe in otherString[5] = (char)0;?

    – chux – Wiedereinsetzung von Monica

    24. Juli 2018 um 17:48 Uhr

  • Das ist ein schlechter Rat. strncpy ist eine gefährliche Funktion, die niemals verwendet werden sollte, da viel zu viele Menschen nicht verstehen, wie sie funktioniert. In diesem Fall strncpy kann die Zeichenfolge selbst je nach Länge mit Null beenden oder nicht. Es ist unbeständig, unzuverlässig und ursprünglich überhaupt nicht für die Verwendung mit nullterminierten Zeichenfolgen gedacht. Sehen Ist strcpy gefährlich und was sollte stattdessen verwendet werden?

    – Ludin

    10. März um 7:24 Uhr

Verallgemeinert:

char* subString (const char* input, int offset, int len, char* dest)
{
  int input_len = strlen (input);

  if (offset + len > input_len)
  {
     return NULL;
  }

  strncpy (dest, input + offset, len);
  return dest;
}

char dest[80];
const char* source = "hello world";

if (subString (source, 0, 5, dest))
{
  printf ("%s\n", dest);
}

  • es wird besser, wenn ‘\0’ am Ziel hinzugefügt wird[len+1] nein?

    – José Linares

    5. März 2016 um 11:35 Uhr

  • Hier gibt es einen subtilen Fehler; Sie müssen if(offset + len) in if(offset) ändern, sonst werden die letzten Zeichen der Zeichenfolge nie gelesen; zum Beispiel: cpp.sh/955ib

    – Blaskovicz

    3. Juli 2020 um 2:46 Uhr

Benutzeravatar von Liao
Liao

char* someString = "abcdedgh";
char* otherString = 0;

otherString = (char*)malloc(5+1);
memcpy(otherString,someString,5);
otherString[5] = 0;

AKTUALISIEREN:
Tipp: Eine gute Möglichkeit, Definitionen zu verstehen, ist die Rechts-Links-Regel (einige Links am Ende):

Beginnen Sie mit dem Vorlesen ab Kennung und sagen Sie laut => “someString ist…”
Gehen Sie nun rechts von someString (Anweisung wurde mit einem Semikolon beendet, nichts zu sagen).
Gehen Sie nun links von der Kennung (* gefunden wird) => sagen Sie also “…ein Zeiger auf…”.
Gehen Sie jetzt nach links von “*“ (das Stichwort char gefunden wird) => sage “..char”.
Fertig!

So char* someString; => “someString ist ein Zeiger auf char”.

Da ein Zeiger einfach auf eine bestimmte Speicheradresse zeigt, kann er auch als “Startpunkt” für ein “Array” von Zeichen verwendet werden.

Das funktioniert mit allem. Probieren Sie es aus:

char* s[2]; //=> s is an array of two pointers to char
char** someThing; //=> someThing is a pointer to a pointer to char.
//Note: We look in the brackets first, and then move outward
char (* s)[2]; //=> s is a pointer to an array of two char

Einige Links:
Wie man komplexe C/C++-Deklarationen interpretiert und
So lesen Sie C-Deklarationen

  • Ich denke, Sie sollten versuchen, zu kompilieren char *[] someThing; und char []* someThing;. Sie wollen char *someThing[]; und char (*someThing)[]; beziehungsweise. Und das bricht Ihren Algorithmus, um Definitionen zu verstehen.

    – Alok Singhal

    22. Januar 2010 um 2:50 Uhr

  • //Danke, Sie haben Recht mit der schlechten Syntax..den Code korrigiert. Der Algorithmus steht jedoch noch, siehe Update.

    – Liao

    22. Januar 2010 um 23:41 Uhr

  • Vergessen Sie nicht, nach Malloc zu befreien

    – ShihabSoft

    8. März 2016 um 20:04 Uhr

  • memcpy(someString, otherString, 5); kann undefiniertes Verhalten haben, wenn someString hat weniger als 4 Zeichen. In Ihrem Beispiel funktioniert es, weil die Quellzeichenfolge länger ist, aber das Verhalten für kleine Quellzeichenfolgen nicht vollständig definiert ist.

    – chqrlie

    16. Juli um 12:10 Uhr

Sie müssen Speicher für die neue Zeichenfolge otherString zuweisen. Im Allgemeinen kann für eine Teilzeichenfolge der Länge n so etwas für Sie funktionieren (vergessen Sie nicht, die Grenzen zu überprüfen …)

char *subString(char *someString, int n) 
{
   char *new = malloc(sizeof(char)*n+1);
   strncpy(new, someString, n);
   new[n] = '\0';
   return new;
}

Dies gibt einen Teilstring der ersten n Zeichen von someString zurück. Stellen Sie sicher, dass Sie den Speicher freigeben, wenn Sie damit fertig sind, indem Sie free() verwenden.

Benutzeravatar von angelvmx
angelvmx

Sie können snprintf verwenden, um einen Teilstring eines char-Arrays mit Genauigkeit zu erhalten. Hier ist ein Dateibeispiel mit dem Namen “substring.c”:

#include <stdio.h>

int main()
{
    const char source[] = "This is a string array";
    char dest[17];

    // get first 16 characters using precision
    snprintf(dest, sizeof(dest), "%.16s", source);

    // print substring
    puts(dest);
} // end main

Ausgabe:

Dies ist eine Zeichenfolge

Notiz:

Weitere Informationen finden Sie auf der man-Seite von printf.

  • Ich bin mir nicht sicher, was das kostet, aber die Tatsache, dass nur eine einzige Standard-Lib verwendet wird, um diese Operation durchzuführen, ist irgendwie bemerkenswert

    – PYK

    4. Juli 2018 um 6:33 Uhr

Benutzeravatar von calvinjarrod
Calvinjarrod

Sie können C-Strings wie Zeiger behandeln. Wenn Sie also erklären:

char str[10];

Str kann als Zeiger verwendet werden. Wenn Sie also nur einen Teil der Zeichenfolge kopieren möchten, können Sie Folgendes verwenden:

char str1[24] = "This is a simple string.";
char str2[6];
strncpy(str1 + 10, str2,6);

Dadurch werden 6 Zeichen aus der kopiert str1 Array hinein str2 ab dem 11. Element.

  • Ich bin mir nicht sicher, was das kostet, aber die Tatsache, dass nur eine einzige Standard-Lib verwendet wird, um diese Operation durchzuführen, ist irgendwie bemerkenswert

    – PYK

    4. Juli 2018 um 6:33 Uhr

Ich denke, es ist ein einfacher Weg … aber ich weiß nicht, wie ich die Ergebnisvariable direkt übergeben kann, dann erstelle ich ein lokales Char-Array als Temp und gebe es zurück.

char* substr(char *buff, uint8_t start,uint8_t len, char* substr)
{
    strncpy(substr, buff+start, len);
    substr[len] = 0;
    return substr;
}

  • start und len Typ haben sollte size_tnicht uint8_t

    – chqrlie

    16. Juli um 12:08 Uhr


1413310cookie-checkKopieren eines Teils einer Zeichenfolge (Substring) in C

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

Privacy policy