text soll wortweise in ein dynamisch erstelltest array kopert werden

tfh-prog

Grünschnabel
tachen, ich bin noch relativ neu in c programmieren, jetzt habe ich folgendes problem ich hoffe mir kann hier jemand helfen..

also ein benutzer soll einen text eingeben können(max 200 zeichen), danach soll der text wortweise in eine dynamisch erstelltest array von Zeichen ketten kopiert werden, anschließend soll das array sortiert und wortweise(ein wortpro zeile) ausgegeben werden, sortierung soll nach dem alphabet gehen. leerzeichen usw sollen ignoriert werden.
also das einlesen, habe ich schon hinbekommen, aber jetzt fehlt mir einfach etwas an wissen. kann euch ja mal reinstellen was ich bis jetzt habe..

Code:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
int main() {
/* char *T;
void * malloc(size_t size);
T = malloc(200);
if(T == NULL){
printf ("kein Speicher vorhanden");
exit(0);
}*/
char text[202];
printf ("\n");
printf ("Texte sortieren\n");
printf ("===============");
printf ("\n");
printf ("\n");
printf ("Geben Sie bitte einen Text (max. 200 Zeichen) ein:\n");
gets (text);
printf ("Der Text war:\n%s",text);
getch();
return 0;
}

das auskommertierte war bis jetzt nur ein versuch, aber ich habe ehrlich keine ahnung wie es weiter geht, würde mich freuen wenn mir jemand weiterhelfen kann
danke schön
 
Zuletzt bearbeitet von einem Moderator:
Also, zunächst benötigst du eine Hilfsliste(2 dimensional). Dort speicherst du die einzelen getrennten Wörter ab. Du kannst dafür eine While Schleife über ein text[] laufen lassen, und immer solange in die Hilfsliste kopieren, bis ein ' ' kommt, dann nimmst du das nächste Feld in deiner Hilfsliste.

Wenn du das gemacht hast, brauchst du nurnoch mittels strcmp() deine Hilfsliste zu sortieren, kannst dir dafür einen einfachen Sortieralgorithmus suchen.... z.b. Quicksort, Mergesort oder sowas


Dann biste eigendlich fertig...

viel Spass ;)
 
In C++ könntest du istringstream, vector<string> aus der STL benutzen um die Wörter in ein dynamisches Array einzulesen (den Einlesevorgang kannst du sogar mit copy() auf nur eine Zeile reduzieren).
Die Klasse und std::string kann auch < bzw > Vergleiche.
Sortieren kannst du den Vector dann mit der Funktion sort.

Das wäre ziemlich kurzer Code.
 
Also ich kann ja auch mal das Ergebniss reinstellen wie es aussehen sollte. Naja am besten stelle ich die ganze Fragestellung rein. bin leider ziemlich neu da drin und hoffe weiter auf unterstützung.

Schreiben Sie ein Programm, mit dem ein Benutzer einen beliebigen Text eingeben, diesen Text wortweise sortieren und auf dem Bildschirm ausgeben lassen kann. Dieser Vorgang soll wiederholt werden, bis der Benutzer nicht mehr möchte.
Der Benutzer soll einen beliebigen Text (max. 200 Zeichen) eingeben können. Dieser Text soll wortweise in ein dynamisch erstelltes Array von Zeichenketten kopiert werden. Dieses Array soll sortiert und dann wieder auf dem Bildschirm (ein Wort pro Zeile) ausgegeben werden. Satz- sowie Leerzeichen und Tabulatoren sollen dabei ignoriert werden. Damit bei der Sortierung die Groß-/Kleinschreibung kein Problem darstellt, sollten vorher alle Buchstaben in Kleinbuchstaben umgewandelt werden.
Zur Lösung des Problems können Sie die Headerdateien stdio.h, stdlib.h und string.h verwenden.
Verwenden Sie eine make-Datei!

Beispiel:

Texte sortieren

===============

Geben Sie bitte einen Text (max. 200 Zeichen) ein:

Dies ist ein langer Satz mit vielen verschiedenen Wörtern und Buchstaben.

Sortierter Text:

Code:
buchstaben
dies
ein
ist
langer
mit
satz
und
verschiedenen
vielen
wörtern
Wollen Sie nochmal (j/n)? n
 
Also, falls das nur eine Tutorials-Aufgabe ist, würde ich es an deiner Stelle nicht machen, denn praktisch wird es ja heute nicht mehr vorkommen, dass man auf reines C angewiesen ist...

Ansonsten: scanf zum Einlesen, damit hab ich zwar noch nie gearbeitet :) , aber ich denk mal, damit kannst du auch wortweise einlesen. Ansonsten -mit gets oder getc- kannst du jeden Buchstaben einzeln überprüfen, ob er ein Leerzeichen ist.

Dynamisches Array musst du wohl selber implementieren (glaub ich mal).

Mit strcmp bzw strcoll kannst du einen Kleiner-/Größer-Vergleich durchführen und anhand der Ergebnisse nach BubbleSort ordnen.


Änderung: lol, unsinnigen Satz gelöscht....
 
Zuletzt bearbeitet:
hi,
nun will ich auch mal meinen senf dazugeben.
mit :
char * strchr(const char *string, int character);
kannst du nach dem ersten vorkommen des Zeichens "character" suchen.
Rückgabewert ist die Position an der das Zeichen steht.
siehe :hier

Also würde ich den eingegebenen Satz so auseinander nehmen:

Code:
char * tmp;
int pos=-1,i=0;

while((pos=strchr(eingabe,' '))!=NULL)  //solange das leerzeichen in eingabe zufinden ist 
{
     
     tmp=malloc (sizeof (char) * 100);  //hier bin ich mir net so sicher ob das so richtig ist 
                                             //soll 100 zeichen reservieren 
     strcpy(tmp,"\0");                //tmp leeren
     strncpy(tmp,eingabe,pos);  //Anzahl (pos) von zeichen in temp kopieren
                                             //zB: strncpy(tmp,"Hallo du kleiner",5)-> tmp="Hallo"
     
     myArray[i]=tmp;                 // temp in dein Array schaufeln
     i++;
     //-----------
     strcpy(tmp,eingabe+pos+1);//ab position (pos) in temp schaufeln
                                              //zB: strcpy(tmp,"Hallo du kleiner"+6) -> tmp= "du kleiner"
     strcpy(eingabe,"\n");            // eingabe löschen
     strcpy(eingabe,tmp);            //eingabe überschreiben
}
if (strlen(eingabe)!=0) myArray[i]=eingabe;    //wenn das letzte Wort nicht leer ist


Ich bin mir net 100% sicher ob der Text fehlerfrei ist, da ich ihn aus dem Kopf getippt hab, und ich schonlange kein C mehr gemacht hab.

Probiers einfach aus.

Mfg Col.Blake
 
Zuletzt bearbeitet:
Oh,
ich hab da ein paar Fehler gefunden.
So is besser:
Code:
char * tmp,temp2[1024];
int pos=-1,i=0;

while((pos=strchr(eingabe,' '))!=NULL)  
{
     tmp=malloc (sizeof (char) * 100);
     strcpy(tmp,"\0");                
     strncpy(tmp,eingabe,pos);  
     myArray[i]=tmp;                 
     i++;
     //-----------
     strcpy(&tmp2,eingabe+pos+1);
     strcpy(eingabe,"\n");            
     strcpy(eingabe,&tmp2);            
}
if (strlen(eingabe)!=0) myArray[i]=eingabe;

Sorry col.blake
 
Zurück