Erstes und letztes Zeichen aus C-String entfernen

Lesezeit: 3 Minuten

Benutzer-Avatar
igul222

Ich habe eine C-Saite, die aussieht "Nmy stringP", wobei N und P ein beliebiges Zeichen sein können. Wie kann ich es bearbeiten in "my string" in C?

  • Hausaufgaben? Fügen Sie das Tag „Hausaufgaben“ hinzu, falls dies der Fall ist.

    – pmg

    13. November 2009 um 0:10 Uhr

  • Nein, keine Hausaufgaben – ich versuche nur, C zum Spaß zu lernen.

    – igul222

    13. November 2009 um 0:18 Uhr

  • In reinem C gibt es so etwas wie einen “String” nicht. Haben Sie einen Zeiger auf einen Puffer (char *) oder ein Zeichenarray (char[])?

    – Markus Elliot

    13. November 2009 um 0:32 Uhr

Benutzer-Avatar
pmg

Um das 1. Zeichen zu „entfernen“, zeigen Sie auf das zweite Zeichen:

char mystr[] = "Nmy stringP";
char *p = mystr;
p++; /* 'N' is not in `p` */

Um das letzte Zeichen zu entfernen, ersetzen Sie es durch a '\0'.

p[strlen(p)-1] = 0; /* 'P' is not in `p` (and it isn't in `mystr` either) */

  • Dies funktioniert möglicherweise nicht, da der Compiler/Linker es durch Initialisieren von “Nmy stringP” als Literal in den Nur-Lese-Speicher stellen kann, wodurch die Bearbeitung fehlschlägt.

    – Feuer unterdrücken

    13. November 2009 um 0:14 Uhr

  • @Suppressingfire: “Nmy stringP” ist in der Tat eine wörtliche Zeichenfolge, aber sie wird (Zeichen für Zeichen) in das Array kopiert mystr. Das Array mystr ist modifizierbar.

    – pmg

    13. November 2009 um 0:17 Uhr

  • Die Literalzeichenfolge wird an die Stelle der Variablen mit dem Namen „mystr“ kopiert. mystr ist nicht ein Zeiger auf das Literal, es ist eine Kopie des Literals.

    – Bryan Oakley

    13. November 2009 um 0:26 Uhr

  • strdup() ist keine Standardfunktion. Seine Funktionsweise bei den Implementierungen, die es als Erweiterung anbieten, kann sich von Implementierung zu Implementierung unterscheiden. ich bevorzuge malloc() und strcpy() wenn gebraucht. Es war nicht nötig zu demonstrieren, wie man das erste und letzte Zeichen einer Zeichenfolge entfernt.

    – pmg

    13. November 2009 um 0:32 Uhr

  • mystr ist kein Zeiger, sondern ein Array, das mit dem Inhalt eines String-Literals initialisiert wird. Der Code, den er hat, ist korrekt.

    – Brian R. Bondy

    13. November 2009 um 0:32 Uhr

Eine weitere Option, wieder unter der Annahme, dass “Bearbeiten” bedeutet, dass Sie an Ort und Stelle ändern möchten:

void topntail(char *str) {
    size_t len = strlen(str);
    assert(len >= 2); // or whatever you want to do with short strings
    memmove(str, str+1, len-2);
    str[len-2] = 0;
}

Dadurch wird die vorhandene Zeichenfolge geändert, ohne eine neue Adresse zu generieren, wie dies bei der Lösung von pmg der Fall ist. Nicht, dass mit der Antwort von pmg etwas nicht in Ordnung wäre, aber in einigen Fällen ist es nicht das, was Sie wollen.

Benutzer-Avatar
Will Daniels

Beachten Sie neben der Antwort von @pmg, dass Sie beide Operationen in einer Anweisung ausführen können:

char mystr[] = "Nmy stringP";
char *p = mystr;
p++[strlen(p)-1] = 0;

Dies wird wahrscheinlich wie erwartet funktionieren, aber das Verhalten ist im C-Standard nicht definiert.

  • Es ist jedoch am besten, sich nicht auf undefiniertes Verhalten zu verlassen.

    – T0xicCode

    8. Dezember 2012 um 21:52 Uhr

  • @ xav0989 Einverstanden, ich wollte das eher als Kommentar hinzufügen (um den Grund hervorzuheben, dies nicht zu tun), nicht als alternative Antwort. Ich bin ein bisschen neu darin.

    – Will Daniels

    10. Dezember 2012 um 15:43 Uhr

Benutzer-Avatar
Brian R. Bondy

Der effizienteste Weg:

//Note destroys the original string by removing it's last char
// Do not pass in a string literal.
char * getAllButFirstAndLast(char *input)
{
  int len = strlen(input); 
  if(len > 0)
    input++;//Go past the first char
  if(len > 1)
    input[len - 2] = '\0';//Replace the last char with a null termination
  return input;
}


//...
//Call it like so
char str[512];
strcpy(str, "hello world");
char *pMod = getAllButFirstAndLast(str);

Der sicherste Weg:

void getAllButFirstAndLast(const char *input, char *output)
{
  int len = strlen(input);
  if(len > 0)
    strcpy(output, ++input);
  if(len > 1)
    output[len - 2] = '\0';
}


//...
//Call it like so
char mod[512];
getAllButFirstAndLast("hello world", mod);

Der zweite Weg ist weniger effizient, aber sicherer, da Sie Zeichenfolgenliterale an die Eingabe übergeben können. Sie könnten strdup auch für den zweiten Weg verwenden, wenn Sie es nicht selbst implementieren möchten.

1369780cookie-checkErstes und letztes Zeichen aus C-String entfernen

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

Privacy policy