Ich habe eine C-Zeichenfolge, die wie "Nmy stringP"
aussieht, wobei N und P ein beliebiges Zeichen sein können. Wie kann ich es in "my string"
in C bearbeiten?Strip erste und letzte Zeichen von C-String
Antwort
zu „entfernen“ den ersten Zeichenpunkt zum zweiten Charakter:
char mystr[] = "Nmy stringP";
char *p = mystr;
p++; /* 'N' is not in `p` */
das letzte Zeichen ersetzen Sie es mit einem ‚\ 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 durch die Initialisierung von "Nmy stringP" als Literal in den schreibgeschützten Speicher versetzt werden kann, wodurch die Bearbeitung fehlschlägt. – Suppressingfire
@Suppressingfire: "Nmy stringP" ist in der Tat eine literale Zeichenfolge, aber es wird (char von char) in das Array "mystr" kopiert. Das Array 'mystr' ist änderbar. – pmg
@pmg: Wo kopierst du? 'char * p = mystr' zeigt' p' auf 'mystr', es kopiert nicht' mystr'. – quark
Der effizienteste Weg, zu entfernen:
//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 es ist sicherer, weil Sie String-Literale als Eingabe übergeben können. Sie können strdup auch für den zweiten Weg verwenden, wenn Sie es nicht selbst implementieren möchten.
Das Problem, das ich bei deiner zweiten Implementierung sehe, ist, dass du sicherstellen musst, dass deine Ausgabe groß genug ist um die Kopie zu verarbeiten, bevor Sie getAllBufFirstAndLast() aufrufen. In diesem Fall würde ich empfehlen, eine outputLength-Variable zum Aufruf hinzuzufügen und die aufgerufene Funktion die Ausgabe mit strn * -Funktionen manipulieren zu lassen. – shank
ja, das ist eine Voraussetzung, yup Sie können einen Längenparameter hinzufügen. –
Eine weitere Möglichkeit, wieder unter der Annahme, dass „Bearbeiten“ bedeutet, dass Sie anstelle ä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;
}
Diese die Zeichenfolge anstelle ändert, ohne eine neue Adresse zu erzeugen als PMG-Lösung der Fall ist. Nicht dass mit pmgs Antwort etwas nicht stimmt, aber in manchen Fällen ist es nicht das, was Sie wollen.
Im Anschluss an @ PMG Antwort, beachten Sie, dass beide Vorgänge in einer Anweisung tun:
char mystr[] = "Nmy stringP";
char *p = mystr;
p++[strlen(p)-1] = 0;
Dies dürfte wie erwartet funktionieren wird, aber das Verhalten ist in C-Standard nicht definiert.
Es ist am besten, sich nicht auf undefiniertes Verhalten zu verlassen. – T0xicCode
@ xav0989 Einverstanden, wollte ich hinzufügen, dass mehr als Kommentar (um den Grund dafür nicht zu markieren), nicht als alternative Antwort. Ich bin ein bisschen neu dabei. –
- 1. Streifen Sie das letzte und erste Zeichen von einem String
- 2. Lösche das erste und letzte 'X'-Zeichen aus dem Zeichenfeld
- 3. Erste und letzte Funktion sas
- 4. Python Wie kann ich erste und letzte doppelte Anführungszeichen
- 5. Wie wird nur das erste Auftreten von Zeichen in CString ersetzt?
- 6. Strip-Methode für Nicht-Leerzeichen Zeichen?
- 7. Regular Expression sowohl erste Zeichen und die letzte Zeichen in Orakeln passend
- 8. Löschen letzte Zeichen von edittext
- 9. erste und letzte Beobachtungen in sas
- 10. Erste und letzte Pixelreihe mit imageData
- 11. erste und letzte Aussagen in SAS
- 12. PHP Codeigniter Seitennummer fehlt Erste und Letzte
- 13. Erste und letzte Tag des aktuellen Monats
- 14. PowerShell strip alle Zeichen nach dem ersten Tab
- 15. TSQL-Strip-Datum von Datetime
- 16. Validate Zeichenfolge keinen Platz char haben und nur das erste und letzte Zeichen als Trennzeichen
- 17. Wie bekomme ich das erste und letzte Element von Array
- 18. Wie entferne ich letzte und erste Leerzeichen von einer Zeichenkette?
- 19. Erstellen von piplot.hist() erste und letzte Bins enthalten Ausreißer
- 20. Varargs und Konvertierungsoperatoren in MFC CString
- 21. Letzte Zeichen/Zeile entfernen
- 22. Strip-Signaturen und Antworten von E-Mails
- 23. „Backspace“ über letzte Zeichen geschrieben
- 24. Loop-Design für erste/letzte Artikel und Artikelgruppen?
- 25. jQuery Strip White-space
- 26. Entfernen letzte Zeichen von Knockout beobachtbaren
- 27. Finden Sie die erste und letzte 20 Zeichen nach bestimmten Schlüsselwort aus der Datenbank?
- 28. JS/JQuery - Entfernen Sie Leerzeichen aus Eingabefeld, wenn es das erste und/oder letzte Zeichen ist
- 29. erste und das letzte Zeichen aus einem String in einer Windows-Batch-Datei
- 30. erste und das letzte Zeichen aus CSV-Datei entfernen Python mit
Hausaufgaben? Fügen Sie das "Hausaufgaben" -Tag hinzu, wenn dies der Fall ist. – pmg
Nein, nicht Hausaufgaben - nur versuchen, C zum Spaß zu lernen. – igul222
In reinem C gibt es keine "Zeichenfolge". Haben Sie einen Zeiger auf einen Puffer ('char *') oder ein Zeichen-Array ('char []')? –