Zeichenkette in Array "einlesen"/übertragen
-
Hey,
ich habe ein kleines Problem mit meinem verfassten Programm.
Es soll ein Wort eingelesen und dann nach Buchstaben sortiert werden. Mein Code bis hierhin lautet:#include <iostream> #include <stdio.h> using namespace std; int main(void) { int i,j,tmp; char array[] = {"wunderschoen"}; //BubbleSort: for (i = 1; i < sizeof(array) ; i++) { for (j = 0; j < sizeof(array) - i ; j++) { if (array[j] > array[j+1]) { tmp = array[j]; array[j] = array[j+1]; array[j+1] = tmp; } } } //Ausgabe for (i = 0; i < sizeof(array); i++) { cout << array[i]; } return 0; }
Funktioniert auch!
Meine Frage jedoch: Ich würde gern ein Wort vom Benutzer eingeben lassen und dieses anstelle des "wunderschoen" im Array speichern lassen.Mit
char* Eingabe; cin >> Eingabe; char array[] = 'Eingabe';
hatte ich kein Glück.
Ich durchforste schon den ganzen Morgen das Internet, jedoch ohne Treffer (vielleicht weil ich nach dem falschen suche?!).Ich wäre über eure Mithilfe sehr dankbar.
-
Gegenfrage: Musst du das so machen, weil der Prof. des sagt etc. Oder darfst du auch C++ machen?
-
@out sagte in Zeichenkette in Array "einlesen"/übertragen:
Gegenfrage: Musst du das so machen, weil der Prof. des sagt etc. Oder darfst du auch C++ machen?
Der Prof sagt: "cdehnnorsuw" muss herauskommen
Lösungsweg ist nicht vorgegeben.
-
Ok dann mach mal C++ und leg das dann deinem Professor vor.
Also Zeichenketten sind vom Typ std::string (#include <string>). Einlesen kannst du mittels des Operators >> (cin>>) oder mit der Funktion getline.
Zum sortieren nimmst du std::sort (#include <algorithm>).
Und dann ist das Programm in 10 Zeilen fertig...
-
@Encelave sagte in Zeichenkette in Array "einlesen"/übertragen:
Mit
char* Eingabe; cin >> Eingabe; char array[] = 'Eingabe';
hatte ich kein Glück.
Ich durchforste schon den ganzen Morgen das Internet, jedoch ohne Treffer (vielleicht weil ich nach dem falschen suche?!).Ich wäre über eure Mithilfe sehr dankbar.
char* Eingabe;
Das bewirkt erstmal nur, dass ein Pointer angelegt wird. Der zeigt aber Standardmäßig irgendwo hin. Mit großer Wahrscheinlichkeit zeigt der sogar auf einen Speicherbereich der dir gar nicht "gehört".
cin >> Eingabe;
Das wiederum bewirkt dass du Text eingeben kannst, der aber an die Stelle des Pointers geschrieben wird ( der "irgendwo" hin zeigt ). Das endet manchmal mit nem Knall. Durch zufällige Zufälle kann es funktionieren. Meistens aber eher nicht.
Wenn du jetzt noch die Hinweise von "out" berücksichtigst(erstmal nur seinen zweiten Satz), kommst du an der Stelle schon mal weiter.
-
@Encelave sagte in Zeichenkette in Array "einlesen"/übertragen:
Warum liest du nicht gleich nach array ein?
char array[] = {"wunderschoen"}; cin >> array;
Ok, ist blöd, wenn da was anderes als 12 Zeichen eingibst.
char array[1000]; cin >> array;
Dann gibt es aber Probleme mit dem sizeof(array), da das dann 1000 ist. Besser ist da
strlen
Dasstrlen
gibt aber die Anzahl der Zeichen an, währendsizeof
die Größe angibt.
In deinem Originalcode ist strlen(array) 12, sizeof(array) 13.Besser du arbeitest mit
std::string
.
-
Darüber hinaus ist "array" bereits ein Schlüsselwort, weshalb es hier auch blau hervorgehoben ist. Also besser die Namensgebung auch noch anpassen
-
@It0101 sagte in Zeichenkette in Array "einlesen"/übertragen:
Darüber hinaus ist "array" bereits ein Schlüsselwort, weshalb es hier auch blau hervorgehoben ist. Also besser die Namensgebung auch noch anpassen
Ist es nicht. Ich mag blau eingefärbte Arrays nicht.
-
@spiri sagte in Zeichenkette in Array "einlesen"/übertragen:
@It0101 sagte in Zeichenkette in Array "einlesen"/übertragen:
Darüber hinaus ist "array" bereits ein Schlüsselwort, weshalb es hier auch blau hervorgehoben ist. Also besser die Namensgebung auch noch anpassen
Ist es nicht. Ich mag blau eingefärbte Arrays nicht.
-
@It0101 https://en.cppreference.com/w/cpp/keyword
Aber wir wissen, was du meinst
-
@out sagte in Zeichenkette in Array "einlesen"/übertragen:
@It0101 https://en.cppreference.com/w/cpp/keyword
Aber wir wissen, was du meinstGenau genommen habt ihr natürlich recht. Ein Schlüsselwort ist es nicht. Verwenden sollte man es trotzdem nicht als Variablenname. Insbesondere dann nicht, wenn man mit "using namespace std;" sowieso schon alles pauschal accessible macht.
-
Super. Endlich eine Lösung nach 4 1/2h.
Wenn man sich dann das Ergebnis anschaut, fragt man sich echt warum man dafür so lang gebraucht hat#include <iostream> #include <string.h> #include <ctype.h> using namespace std; int main() { int iCount1,iCount2,tmp; char arrEingabe[1000]; cin >> arrEingabe; //alle Großbuchstaben zu Kleinbuchstaben for(iCount1=0;iCount1 < strlen(arrEingabe);iCount1++) { arrEingabe[iCount1]=tolower(arrEingabe[iCount1]); } //BubbleSort: for (iCount1 = 1; iCount1 < strlen(arrEingabe) ; iCount1++) { for (iCount2 = 0; iCount2 < strlen(arrEingabe) - iCount1 ; iCount2++) { if (arrEingabe[iCount2] > arrEingabe[iCount2+1]) { tmp = arrEingabe[iCount2]; arrEingabe[iCount2] = arrEingabe[iCount2+1]; arrEingabe[iCount2+1] = tmp; } } } //Ausgabe for (iCount1 = 0; iCount1 < strlen(arrEingabe); iCount1++) { cout << arrEingabe[iCount1]; } return 0; }
Ich habe euren Rat angenommen und den Namen des Arrays geändert. Sollte zufälligerweise später noch eins dazukommen, ist das sowieso besser.
Zusätzlich musste ich noch einbauen, dass alle Großbuchstaben in Kleinbuchstaben umgewandelt werden, da diese sonst vor den Kleinbuchstaben sortiert werden.
Hoffe es hat nun alles seine Richtigkeit und bedanke mich nochmal herzlich bei euch
-
@Encelave
Und was passiert, wenn du mehr als 1000 Zeichen eingibst?
-
@It0101 sagte in Zeichenkette in Array "einlesen"/übertragen:
@Encelave
Und was passiert, wenn du mehr als 1000 Zeichen eingibst?Dann habe ich ein Problem
Ein Array mit variabler Größe wäre schon recht gut, ja.
Aber frag mich bitte nicht, wie man das hinbekommt.Hat sicherlich was mit meiner Schwäche dem Pointer zu tun (signed, unsignend?)
-
C mit cout - echt toll.
std::string war jetzt zu kompliziert?
-
@Encelave
Daher weiter unten die Empfehlung mit "std::string". Der Vorteil für dich:
Egal wieviele Zeichen du eingibst: Der notwendige Speicher wird von diesem Object "std::string" stetig in Eigenregie beschafft, weil die Klasse den Operator "<<" überladen hat und daher genau weiß, wieviele Zeichen gerade hinzukommen.Siehe hier:
http://www.cplusplus.com/reference/string/string/operator%3C%3C/std::string MeinText; std::cin >> MeinText;
-
Das Programm sollte sehr kurz sein:
#include <algorithm> #include <iostream> #include <string> int main() { std::string s; getline(std::cin, s); std::sort(begin(s), end(s)); std::cout << s << '\n'; }
-
@It0101 sagte in Zeichenkette in Array "einlesen"/übertragen:
std::string MeinText; std::cin >> MeinText;
Klingt zwar sehr gut, heißt aber, dass BubbleSort hier logischerweise nicht mehr funktioniert.
std::sort
ist hierfür wohl die Lösung.
In http://www.cplusplus.com/reference/algorithm/sort/?kw=sort heißt es, dass man dafür einen Anfangs und ein Endwert benötigt. Im Beispiel der Internetseite werden dafür Vektoren verwendet. Das übersteigt jedoch derzeit mein Verständnis.
-
Klingt zwar sehr gut, heißt aber, dass BubbleSort hier logischerweise nicht mehr funktioniert.
Begründung?
-
@manni66 Davon Bin ich jetzt einfach ausgegangen, da ich keinen Plan habe, wie man mit einer Laufvariable auf die einzelnen Zeichen des strings zugreifen kann. Lag ich falsch mit meiner Annahme?