Längsten String finden
-
Hallo Leute!
Also ich lege dynamisch eine vom Benutzer eingegebene Anzahl von Strings an. Klappt alles toll, jedoch muss ich auch den längsten und den kürzesten String ausgeben. Hab dazu schon 2 Schleifen geschrieben (in der main()), die aber nicht richtig funktionieren.
Ich poste mal den kompletten code damit ihr den Zusammenhang versteht...
Wie komm ich an den längsten und den kürzesten String?
#include <iostream> #include <string> #include <algorithm> #include <functional> #include <fstream> #include <cctype> using namespace std; int main() { int anzahl=0,i=0; int einlesen(string*, int&); int umwandeln(string*, int&); // Anzahl der Strings definieren cout << "Wie viele Zeichenketten möchten Sie eingeben?" << endl << endl; cin >> anzahl; fflush(stdin); string *feld = new string[anzahl]; // Einlesen der Strings einlesen(feld, anzahl); // Umwandlung im Kleinbuchstaben und Sortierung umwandeln(feld, anzahl); // Ausgabe der sortierten Strings while (i < anzahl){ cout << "Zeile " << i+1 << ": " << feld[i] << endl; i++; } //Laengster String int lang = 0; for (int i=0; i < anzahl; i++) { if (feld[i+1].length() >= feld[lang].length() ) { lang = i; } } //Kuerzester String int kurz = 0; for (int i=0; i < anzahl; i++) { if (feld[i+1].length() <= feld[kurz].length()) { kurz = i; } } cout << "lang: " << lang+1 << endl; cout << "kurz: " << kurz+1 << endl; // Halt-Befehl cin.get(); return 0; } int einlesen(string* pfeld, int& anzahl) { for (int j=0; j < anzahl ;j++) { cout << "Bitte geben Sie string " << j+1 << " ein!" << endl; getline(cin,pfeld[j]); } return 0; } int umwandeln(string* pfeld, int& anzahl) { for (int j=0; j < anzahl; j++) { for (unsigned int k=0; k < pfeld[j].length(); k++) { pfeld[j][k] = tolower(pfeld[j][k]); } sort(pfeld[j].begin(), pfeld[j].end()); } return 0;}
-
Was bekommst du den heraus? Was genau funktioniert nicht?
btw:
Ich habe das seltsame Gefühl, dass deine beiden Vergleichsschleifen beide über die Arraygrenze hinauslaufen ...
-
Tue dir selber den gefallen und nutze einen Container aus der Standardbibliothelk für die Liste der Strings.
Ansonsten: Der Index bei einem Array (und auch bei den Standardcontainern) beginnt bei 0 und endet bei n-1, wobei n die Anzahl der Elemente ist.
Bei deiner Schleife greifst du aber auf die Elemente von 1 bis n zu. Das kann nicht gut gehen.
-
Ja mal so mal so... Kommt halt drauf an an welcher Position ein langer oder kurzer String ist... mal kommt das richtige raus und mal nicht...
Sorry hört sich blöd an, aber ich hoffe das jemand eine "sichere" Methode, die besagten Strings zu finden, weiß.
Das mit den Grenzen ist natürlich auch möglich...
Eine Idee und etwas pseudo-code würden mir schon helfen...

-
Oft hilft es das Rad nicht immer neu erfinden zu wollen:
#include <iostream> #include <list> #include <string> #include <iterator> #include <algorithm> typedef std::list <std::string> StringList; typedef StringList::const_iterator Iterator; StringList read_strings() { StringList strings; std::string string; while (std::getline(std::cin, string)) if (string == "") break; else strings.push_back(string); return strings; } bool is_shorter(std::string const& lhs, std::string const& rhs) { return lhs.size() < rhs.size(); } int main() { std::cout << "Geben sie ein paar Strings ein: " << std::endl; // read: StringList strings = read_strings(); // sort: strings.sort(); std::cout << "Hier ihre Eingaben, aber sortiert:" << std::endl; std::copy(strings.begin(), strings.end(), std::ostream_iterator <std::string> (std::cout, "\n")); std::cout << std::endl; // longest string: Iterator longest = std::max_element(strings.begin(), strings.end(), is_shorter); std::cout << "Die laengste Eingabe war: " << *longest << std::endl << "Mit einer Laenge von " << longest->size() << " Buchstaben. " << std::endl; // shortest string: Iterator shortest = std::min_element(strings.begin(), strings.end(), is_shorter); std::cout << "Die kuerzeste Eingabe war: " << *shortest << std::endl << "Mit einer Laenge von " << shortest->size() << " Buchstaben. " << std::endl; std::cin.get(); }Strings werden in unbegrenzter Anzahl eingelesen bis man einfach so Enter drückt ohne vorher etwas einzutippen. Ansonsten ist der größte Teil des Codes Ausgabe. Der Rest sollte einigermaßen selbst erklärend sein.
Gruß
Don06
-
@Don06...
wow...
jetzt bin ich erstmal platt.. nachdem ich den code kurz auseinandergefriemelt hatte, kam ich mir gleich richtig bescheuert vor. bin noch nicht so lange dabei und die verwendung von typedef seh ich zum ersten mal 
hoffentlich komm ich da auch mal hin, solche code zu erzeugen

eine sache noch: gibts ne möglichkeit mein problem zu lösen, ohne meinen entwurf vollständig zu verwerfen? weil dein code ja ganz anders aufgebaut ist, als meiner

danke für den super code und die erleuchtung!

-
Einfach gleich nach Länge sortiert speichern.
#include <string> #include <map> #include <iostream> typedef std::map <size_t, std::string> StringMap; StringMap read_strings() { StringMap strings; std::string string; while (std::getline(std::cin, string)) if (string == "") return strings; else strings.insert(std::make_pair(string.length(),string)); } int main() { std::cout << "Geben sie ein paar Strings ein: " << std::endl; StringMap strings = read_strings(); if(strings.size() == 0) return 0; std::cout << "Die laengste Eingabe war: " << strings.rbegin()->second << std::endl; std::cout << "Die kuerzeste Eingabe war: " << strings.begin()->second << std::endl; }Was du machen musst, wenn man mehrere gleich lange eingibt, darfst du dir selber ausdenken (std::multimap).