[Novize] Wie kann ich Zahlen UND Strings in einer Var speichern?
-
Hallo Leute!
Mal ne Frage die wohl direkt mit Nein beantwortet wird, insofern ich nichts darüber finden kann via Google und Konsorten.
Ich würde gerne die User Eingabe nach einer Abfrage einerseits nach einer Zahl aber auch mit einem String prüfen:char Menu[4]; printf("\nWelcome to 'Human End' Text RPG Game.\n\n"); printf("In this game you will roam through a tiny town which has been\n"); printf("cut off from the civilisation around. You start in the middle\n"); printf("of this town and your goal is to survive and choose the best\n"); printf("decisions to keep yourself alive.\n\n"); printf("Choose one of the options below:\n\n"); printf(":: Start Game type '1'\n"); printf(":: Options type '2'\n"); printf(":: Help type 'help'\n"); scanf("%s",Menu); printf("Debug Menu Array: %s",Menu);
Ich arbeite mich mit zich Tutorials und Dokus an "C" heran und stehe nun vor einer Frage die wohl wegen etwas mageren Array und Pointer Lektionen aufkam.
Mit welchem format specifier kann ich bei scanf() Zahlen UND String abrufen.
Wie man sieht will ich dort bei Eingabe 1 o. 2 etwas bewirken - aber auch "Help" Soll zu etwas führen - wohin das führen soll und warum ich das vll. nicht "besser" gestalte könnt ihr mir überlassen.
Ich möchte mich erstmal Stück für Stück in den simplen Lösungen probieren bevor ich zu den fortgeschrittenen übergehe bzw. mich dort einlese.Die Betroffenen Punkte sind die char Variable Array "Menu[4]" und Zeile 12 und 13.
Ich bedanke mich für jeden kleine Stupser in die richtige Richtung.
PS: Bitte keine Vorschläge wie ich das Ganze besser und professioneller schreiben kann. Ich weiss es gibt Möglichkeiten - um die Sorge ich mich aber viel später
**Edit: Das Array an sich funktioniert auch nicht - kann über scanf() um weitem mehr Wortreihen angeben die auch ausgegeben werden als in Menu[4] eigentlich Platz für sein sollte.
Hatte nen harten Tag, normalerweise mache ich diese Array Fehler nicht mehr - nur bin so leer im Kopf das ich auch nimmer weiss was ich da schreiben :(**
-
Lies eine Zeichenkette ein. Analysiere dann den Inhalt der Zeichenkette. Die Analyse brauchst du noch nicht einmal selber programmieren, du kannst zum Beispiel sscanf auf die Zeichenkette anwenden und den Rückgabewert prüfen.
-
Falke88 schrieb:
[b]Edit: Das Array an sich funktioniert auch nicht - kann über scanf() um weitem mehr Wortreihen angeben die auch ausgegeben werden als in Menu[4] eigentlich Platz für sein sollte.
Klassischer Bufferoverlow. Deswegen immer eine Höchstlänge angeben (in der Doku von scanf gucken, wie das genau geht. Ich verrate es absichtlich nicht, damit du lernst, diese zu nutzen). Ich könnte mir auch gut vorstellen, dass du vielleicht eher fgets zum Einlesen benutzen möchtest. scanf trennt Stringeingaben an whitespaces, fgets trennt Stringeingaben bei newlines.
-
SeppJ schrieb:
Falke88 schrieb:
[b]Edit: Das Array an sich funktioniert auch nicht - kann über scanf() um weitem mehr Wortreihen angeben die auch ausgegeben werden als in Menu[4] eigentlich Platz für sein sollte.
Klassischer Bufferoverlow. Deswegen immer eine Höchstlänge angeben (in der Doku von scanf gucken, wie das genau geht. Ich verrate es absichtlich nicht, damit du lernst, diese zu nutzen). Ich könnte mir auch gut vorstellen, dass du vielleicht eher fgets zum Einlesen benutzen möchtest. scanf trennt Stringeingaben an whitespaces, fgets trennt Stringeingaben bei newlines.
Mit whitespaces sind Leerzeichen wohl auch gemeint. Das stimmt schon scanf gibt nur die Kette vor einem leerzeichen aus. Jedoch würde fgets auch nur trennen wenn ich Enter drücke oder?
Ich könnte dann immernoch helppppppblabla schreiben
- insofern fgets nicht auch kürzbar ist wie scanf ( z.b. bei %.3f - für ein Float mit max 3 Stellen nach dem Komma - Darauf wolltest du denke ich hinaus - also so kenne ich es von printf() denke mal wird für scanf() genauso gehandled?!)
Also die Begrenzung eines Arrays wirkt hier ja auch nicht wirklich ein
-
Falke88 schrieb:
Jedoch würde fgets auch nur trennen wenn ich Enter drücke oder?
Oder wenn die Maximalanzahl erreicht ist. Darum gibt man sie ja an.
Falke88 schrieb:
- also so kenne ich es von printf() denke mal wird für scanf() genauso gehandled?!)
Schließe nie von printf auf scanf und umgekehrt. Das sind zwei völlig verschiedene Funktionen.
Lies die Referenzen zu den Funktionen.
(printf gibt bei %s auch Leerzeichen mit aus)
-
Habe mich in fgets versucht und folgendes passiert:
char Menu[5]; ... fgets(Menu,10,stdin); printf("Debug Menu Array: %s\n",Menu);
Wenn ich im 2. Parameter ne 10 eingebe begrenzt er das Ganze auch nur auf 10 bzw. 9 + NULL.
Ich verstehe demnach nicht wozu ich ein Array festlege wenn es eh ignoriert wird.
Oder wurden alle 5 Speicherorte des Arrays genutzt und zusätzlich 5 willkürliche dazugebracht?
Verursacht dies bei komplexeren Programmen schwerwiegende Probleme? Insofern es so reagiert wie ich es beschrieben habe?
-
Falke88 schrieb:
Ich verstehe demnach nicht wozu ich ein Array festlege wenn es eh ignoriert wird.
C ist eben keine Sprache für den Ponyhof. Wenn du das willst, nimm Java oder ähnliches. Dafür ist C schnell. In C wird davon ausgegangen, dass der Programmierer weiß, was er tut. Keinerlei Sicherheitsprüfungen zur Laufzeit, es sei denn der Programmierer programmiert sie sich selber. Und zur Compilezeit wird ebenfalls gemacht, was der Programmierer sagt, es sei denn es ist technisch unmöglich. Dein fgets-Aufruf wird 10 chars beschreiben, selbst wenn da nur 5 sind. Es wird davon ausgegangen, dass du ein Super-1337-Hexxor bist, der wirklich möchte, dass hinter dem Array noch 5 weitere Elemente beschrieben werden.
Oder wurden alle 5 Speicherorte des Arrays genutzt und zusätzlich 5 willkürliche dazugebracht?
Nein, es wird einfach über das Ende des Arrays hinaus gegangen, egal was da ist.
Verursacht dies bei komplexeren Programmen schwerwiegende Probleme?
Oh, ja! Und wie!
Insofern es so reagiert wie ich es beschrieben habe?
Eigentlich hast du wohl eher Pech, dass sich der Fehler nicht direkt äußert. Es ist ganz sicher nicht das, was du beabsichtigst. Ein echter Super-1337-Hexxor weiß zwar, was hier passiert und kann das eventuell für tolle Tricks nutzen, aber für dich ist es ein Fehler. Genau genommen ist es undefiniertes Verhalten, das heißt, es darf absolut alles passieren. Der Computer darf bei Ablauf des Programmes auch die Festplatte formatieren; die Katze schwängern; oder vierbeinige Wasser gurkicht dünken, was immer das bedeuten mag. Alles. Dazu zählt eben auch, dass es hier scheinbar tadellos funktioniert.
-
Ha böses C...
Nun gut - dann muss ich wohl mehr Eigentverantwortung übernehmen
Sieht es denn so aus das die [5] Arrays wenigstens genutzt worden? Wobei das kann ich ja mit ner Adress Ausgabe herausfinden und mehrmaligem ausführen - die Memory Adress dürfte sich da ja nicht mehr dynamisch ändern
-
Der 2. Paramter bei fgets soll angeben wieviel Platz in dem Speícherbereich ist, den du mit dem ersten Paramter angibst.
Und ein Array hat in C eine feste Länge und eine feste Adresse. Dies wird nach der Definition nicht mehr geändert.
Darum ist ein Array auch etwas anderes als ein Pointer/Zeiger.