Element eines Arrays löschen
-
hallo,
ich würde gerne einen buchstaben aus einem char-array (genauer gesagt einem string) entfernen.
ich hab bisher diesen forenbeitrag gefunden:
http://www.c-plusplus.net/forum/227255-fullhilft mir allerdings wenig.
es wird der vorschlag gemacht, dass man alle zu löschenden elemente ans ende des array verschiebt, und anschließend alle array-elemente (außer die am ende) in ein kleineres array kopieren soll.
aber wie verschiebe ich array-elemente?
und gibt es vielleicht eine bessere lösung?
-
Wie würdest du es denn bei Scrabble machen (wenn du immer nur einen Buchstaben auf einmal verschieben darfst)?
-
tut mir leid, aber ich weiß nicht, was du mir damit sagen willst...
-
Du sollst das per Hand nachspielen.
Nimm einen Zettel, mal Kästenchen darauf;+-+-+-+-+-+-+-+-+-+-+-+ | | | | | | | | | | | | +-+-+-+-+-+-+-+-+-+-+-+
Nummeriere sie:
+-+-+-+-+-+-+-+-+-+-+--+ | | | | | | | | | | | | +-+-+-+-+-+-+-+-+-+-+--+ 0 1 2 3 4 5 6 7 8 9 10
Schreib Text rein:
+-+-+-+-+-+-+-+-+-+-+--+ |H|a|l|l|o| |W|e|l|t|\0| +-+-+-+-+-+-+-+-+-+-+--+ 0 1 2 3 4 5 6 7 8 9 10
Jetzt schreib auf, was du machen musst, wenn du das Zeichen an Stelle 5 löschen willst.
Schritt für Schritt.
-
ok, aber dieser string ist variabel, das ist dann also jedes mal anders
-
Es gibt auch Schleifen, wo man die Anzahl vorher nicht angeben muss.
Und wie ist in C ein String definiert? Wo ist der zu Ende?
-
DirkB schrieb:
Wo ist der zu Ende?
bei '\0'
ich seh schon, dass wird dann wieder etwas komplizierter.
danke.
-
1234567890 schrieb:
ich seh schon, dass wird dann wieder etwas komplizierter.
Das ist eigentlich ein Zweizeiler. (Mit Funktionskopf, Klammern und return sind es 7 Zeilen)
Das mit der '\0' macht es gerade einfach.
Du musst in einer Schleife nicht unbedingt auf sowas wie i<n prüfen.
Du kannst auch prüfen ob ein Arrayelement einen/keinen besonderen Wert hat.
-
ja, danke.
ich wollte noch fragen: was ist der unterschied zwischen ' ' und '\0'?
-
Moin,
Ich weiß man sollte an sich keine Lösungen posten, aber da ich mich gerade langweile, mag ich meinen Lösungsvorschlag mal posten:
char* del_ch(char* str, size_t pos) { for(; str[pos]!='\0'; pos++) str[pos] = str[pos+1]; return str; }
Die for-Schleife wird so lange wiederholt, bis die Nullterminierung erreicht wurde.
Die Zeichen werden alle um eine Stelle nach vorne geschoben, wobei beim ersten Durchlauf das gewünschte Zeichen ganz einfach überschrieben wird.Ein Leerzeichen ist ganz einfach nur ein Leerzeichen. \0 gibt an, dass an dieser Stelle der String zu Ende ist.
-
Sagt dir ASCII etwas?
Jedes Zeichen hat einen Zahlewert. Für die Zuordnung gibt es Codetabelle.
Sagt dir ASCII etwas?' ' ist das Leerzeichen (ASCII-Wert 32)
'\0' ist das Zeichen mit dem Wert 0
'0' ist das Zeichen, das die Ziffer Null darstellt (ASCII-Wert 48)Statt '\0' kannst du auch einfach 0 schreiben (ohne Hochkomma).
Die Zeichenschreibweise macht nur deutlich, was gemeint ist.Es gibt auch noch andere Codetabellen als ASCII. Z.B. EBCDIC auf (IBM-)Großrechnern.
-
@Minispiri
Das i braucht man nicht wirklich, dafür kann man gleich pos nehmen.
Dann sollte man in alter C-Manier den Zeiger auf das Array auch wieder zurück geben.char *strcclr(char *str, size_t pos);
Warum? Dann kann man sowas machen:
char t[] = "Hallo Welt!"; puts(strcclr(t, 5));
Eine Überprüfung, ob pos noch innerhalb des Strings ist (also vor dem '\0' liegt) kann man auch noch machen.
Dies ist in C aber nicht üblich. Dafür hat der Aufrufer zu sorgen.
-
vielen dank, aber ich werde meine eigenen code schreiben (der ist dann halt ich so kompakt, kann aber das selbe).
-
1234567890 schrieb:
vielen dank, aber ich werde meine eigenen code schreiben (der ist dann halt ich so kompakt, kann aber das selbe).
Was willst du daran denn noch komplizierter machen?
Alles was du da sonst noch an Variablen und Berechnungen hast, ist überflüssig.
-
danke, hab das jetzt hinbekommen.
lg
-
DirkB schrieb:
@Minispiri
Das i braucht man nicht wirklich, dafür kann man gleich pos nehmen.
Dann sollte man in alter C-Manier den Zeiger auf das Array auch wieder zurück geben.char *strcclr(char *str, size_t pos);
Warum? Dann kann man sowas machen:
char t[] = "Hallo Welt!"; puts(strcclr(t, 5));
Eine Überprüfung, ob pos noch innerhalb des Strings ist (also vor dem '\0' liegt) kann man auch noch machen.
Dies ist in C aber nicht üblich. Dafür hat der Aufrufer zu sorgen.Jop, hast vollkommen Recht, ich hab das Lösungsbeispiel auch dementsprechend umgeändert.
Danke für die Info.