while schleife funktioniert nicht (s muss änderbarer Ivalue sein)
-
Hallo zusammen,
ich möchte eine while Schleife laufen lassen die immer eine Position in meinem String weiterläuft, nebenher läuft ein integer mit der mir nach jedem durchlaufen der Schleife die Zahl ausgibt, die ich dann zur Veranschaulichung der Positionen der einzelnen Zeichen meines Strings nutze.Das Problem ist das mir s markiert wird "s muss änderbarer Ivalue sein"
Muss ich was an meinem s in der Schleife ändern oder muss ich mein char s[] = "string" anders definieren?Danke schon mal im vorraus.
case 4: printf("\nLöschen Sie ein Zeichen im Hauptstring mittels seiner Positionsangabe:\n"); printf("0\n"); printf("%s\n", s); while (*s != 0) { printf("%i", i); s++; // Fehlermeldung bis s ! i++; } printf("\nBei welcher Position soll das Zeichen gelöscht werden? >\n"); scanf("%i", &i); myStrChrDeleteByPosition(s, i); break;
-
Ein Array ist kein Pointer.
Ein Array kann nach der Definition nicht mehr in der Größe und Lage (Adresse) geändert werden.
Darum kann man einem Array auch keine neue Adresse zuweisen, was ja bei einem Postinkrement passiert.
Schreib eine Funktion die das macht ( Zeichen an Position löschen), da hast du das Problem nicht, da der übergebene Parameter ein Zeiger ist.
-
wie wärs mit
int i = 0; while(s[i] != 0) { ///////// i++; }
die alte variable i musst du dann natürlich umbenennen.
-
@DirkB Danke für die Antwort, aber eine Funktion zum löschen eines Zeichens habe ich bereits bzw. das ist nicht das Problem. In der Konsole soll der String ausgegeben werden und darunter die Positionen (Zahlen: 0123456..). So steht der erste Buchstabe über der 0 der zweite über der 1 usw. Um diese Zahlen in Abhängigkeit zur Länge des Strings auszugeben möchte ich die while Schleife laufen lassen. wenn s++; dann auch i++; und die einzelne Ausgabe von den i´s auf die Konsole. Und da das Problem die schleife mit s++; ist nicht zulässig.
Wenn ich dich richtig verstanden habe muss ich also den definierten string, char [] = "string" anders schreiben um ihn ändern zu können?
-
@Wade1234 Bekomme bei s++; leider noch immer diese Fehlermeldung.
Hab mir überlegt diese while schleife einfach als seperate Funktion zu machen und dann in meiner Funktion an der stelle einzufügen bzw. laufen zu lassen.
Das funktioniert doch, oder? Funktion in Funktion.
-
@Platinumer
das s++ musst du dann weglassen. mit s[i] greifst du auf das i-te element zu. also ein programm, um ein zeichen aus einem array zu löschen, könnte dann so aussehen:int main() { char array[100] = "Dies ist ein Test."; unsigned int pos; unsigned int i; printf("Welches Zeichen moechten Sie loeschen?\n"); scanf("%u", &pos); for(i = pos; array[i] != 0; i++) { array[i] = array[i + 1]; } printf("%s\n", array); return 0; }
normalerweise musst du da aber noch die position gegen die länge prüfen, aber das habe ich jetzt mal weggelassen.
-
Okay das mit der Schleife hab ich gelöst bekommen. Hab eine kleine seperate Funktion geschrieben.
Jetzt bleibt nur noch das Problem mit dem "Zeichen an Position löschen". Probiere deine Idee gleich mal aus @Wade1234@Wade1234 hat geklappt, danke
-
ich finde, dass du nicht mit zeigern arbeiten solltest, solange du nicht mit arrays arbeiten kannst.
-
Dieser Beitrag wurde gelöscht!
-
@Wade1234 sagte in while schleife funktioniert nicht (s muss änderbarer Ivalue sein):
ich finde, dass du nicht mit zeigern arbeiten solltest, solange du nicht mit arrays arbeiten kannst.
lool
-
void myStrChrDeleteByPosition(char *s,int i) { for(char *p=s+i;*s=s[s>=p];++s); }
-
@Platinumer sagte in while schleife funktioniert nicht (s muss änderbarer Ivalue sein):
muss ich also den definierten string, char [] = "string" anders schreiben um ihn ändern zu können?
Du kannst jederzeit einen weiteren Zeiger auf das Array zeigen lassen.
So wie du es versuchst, würde die Information über den Anfang des Arrays verloren gehen.
-
@Wutz: Nicht sehr effizient für lange Strings mit hohem Index (aber dafür konstant je String ;- ).
-
@Sarkast sagte in while schleife funktioniert nicht (s muss änderbarer Ivalue sein):
Was du wirklich brauchst, ist überdies https://man.cx/strcpy
strcpy()
hat für sich überlappende Speicherbereiche UB, ist also für das "Löschen" in-place nicht geeignet.
-
@Swordfish Du hast völlig recht, die ganze Familie mag kein Overlapping.
-
@Sarkast sagte in while schleife funktioniert nicht (s muss änderbarer Ivalue sein):
@Swordfish Du hast völlig recht, die ganze Familie mag kein Overlapping.
memmove verträgt es.