Ausgabe von maximal einer Leerstelle zwischen den Wörtern
-
Hallo,
ich absoluter C-Neuling was man bestimmt auch an meinem Code sieht...
Also wir sollen einen Text eingeben, das Ende der Texteingabe ist dann die Eingabetaste. Danach soll der Text wieder ausgegeben werden, jedoch soll zwischen den Wörtern maximal ein Leerzeichen stehen.#include <stdio.h> #include <stdlib.h> int main() { int i, i2; char ausgtext[100], text[100]; //das sollen meine Variablen sein printf ("So, Text eingeben\n"); for (i=0; getchar() != '\n'; i++) //zeichenweise einlesen bis enter kommt { scanf ("%c", &text[0]); } text[i] = '\0'; printf ("ausgabe\n"); for (i2=0, i=0; text[i]!='\0'; i++,i2++) { if (text[i]==' '&& text[i+1]==' ') ausgtext[i2]=' '; else ausgtext[i2]=text[i];} printf ("%s", ausgtext); getchar(); return 0; }
Also naja, geht halt nich. Wäre cool wenn mir jemand einen Denkanstoss geben kann, damit ich rausfinden kann warum das nich geht. Hab einfach ma rumprobiert, doch irgendwie bin ich mit meinem Ergebniss nich so zufrieden.
-
Zeile 14 soll doch bestimmt scanf ("%c", &text[i]); heißen.
Das Ganze unter der ersten for-Schleife würde ich wegschmeißen und stattdessen ein char letztesZeichen benutzen wo eben das letzte Zeichen gespeichert wird.
Dazu nochif (letztesZeichen==text[i]==' ') i--; //Leerzeichen nach Leerzeichen werden ignoriert
in die for-Schleife einbauen.
Dir sollte auch klar sein dass es kracht wenn jemand auf die dumme Idee kommt mehr als 100 Zeichen einzutippen. Zahlen in Arrayklammern sind einfach böse und zeugen von faulen Programmierern. Seh dir mal malloc und free an und vielleicht noch http://de.wikipedia.org/wiki/Puffer%FCberlauf.
-
Danke in Zeile 14 hab wohl ich nen Fehler.
Das mit malloc und co. hatten wir noch nich, deshalb die eckigen Klammern mit Werten, geh ich recht in der Annahme das ich mit malloc das ganze dynamischer machen kann? Werd ich mir gleich mal reinprügeln.
Das mit char letztesZeichen hab ich noch nich ganz kapiert.
Aufe jedenfall schon mal danke für die Antwort.
-
Du sollst doch das Eingegebene wieder ausgeben, nur halt ohne mehrfache Leerzeichen. Also merkst du dir das zuletzt eingegebene Zeichen, und wenn dieses zuletzt eingegebene Zeichen ein Leerzeichen ist und du wieder ein Leerzeichen ließt dann überspringst du dieses Leerzeichen. Auf diese Weise hast du nie mehrfache Leerzeichen. Ist einfacher als erst Alles zu speichern und dann die überflüssigen Leerzeichen herauszufischen.
Mit malloc kannst du dir Speicher holen und mit free wieder freigeben. Sowas wie:
int buffersize = 32; char *buffer = malloc(buffersize); bool allesgelesen = false; int bereitsgelesenezeichen = 0; while (!allesgelesen){ //lese maximal buffersize Zeichen in buffer hinter die bereits gelesenen Zeichen ein int AnzahlGelesenerZeichen = fscanf(stdin, "%*.s", buffersize, buffer+bereitsgelesenezeichen); if (AnzahlGelesenerZeichen==buffersize){ //es konnte nicht alles gelesen werden, buffer zu klein buffersize = buffersize*2; //exponentielles buffergrößenwachstum char *newbuffer = malloc(buffersize); strcpy(newbuffer, buffer); free(buffer); buffer = newbuffer; bereitsgelesenezeichen+=AnzahlGelesenerZeichen; } else allesgelesen = true; //alles gelesen } //was mit der eingabe machen free(buffer);
Betrachte das als Pseudocode. Es ist nämlich kein C und so einige Bugs sollten drin sein und das Leerzeichenüberspringen ist nicht drin, aber das Prinzip des Eingabe lesens mit dynamischem Speicher sollte klar werden. Ist deutlich mehr Aufwand, dafür funktionierts aber auch.