Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Azasel

unregistriert

1

19.04.2017, 14:42

[C] getchar() Anweisung wird ignoriert

Guten Tag,
Ich bin gerade dabei ein kleines Konsolenspiel in C zu schreiben.
Nun bekomme ich immer wieder Probleme beim Einlesen von Zeichen(ketten).
2. wird die switch Anweisung in meinem Programm auch übersprungen.
Vielleicht kann ja jemand über meinen Quellcode schauen und mir ein paar nützliche Tipps für die Zukunft mitgeben.
Das würde mich sehr freuen, weil ich andauernd Fehler mache.


Zur Zeit arbeite ich mit dem Buch >>C von Kopf bis Fuß<< und nebenbei lese ich auch das Buch >>C programmieren lernen 2017(von Dan Gookin)<<" und ich komme gut voran, aber wenn ich etwas praktisch umsetzen will, wo man etwas aus der Standard Eingabe einlesen soll, bekomme ich immer Probleme.

Danke schonmal im Voraus :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

19.04.2017, 14:59

Formulier das mal als konkrete Frage.

Zeile 60 ist ein Buffer-Overflow, du kopierst mehr Werte in einen Datenbereich als er eigentlich groß ist ("keine"=6, "Gewehr"=7 chars [eins mehr weil '\0']).

Munition schreibt man mit 'u' ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Azasel

unregistriert

3

19.04.2017, 15:23

Formulier das mal als konkrete Frage.

Ok :)
Wieso wird in Zeile 55 nicht nach der Eingabe gefragt?

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

4

19.04.2017, 15:32

Ich tippe mal darauf, dass du ein /n aus der vorherigen Eingabe im buffer hast.
scanf() statt getchar() schafft hier Abhilfe
(http://www.cplusplus.com/reference/cstdio/scanf/)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

19.04.2017, 15:39

Nun, 'übersprungen' wird da nix, prüf doch mal mit dem Debugger welchen Wert 'input' dann nach der Zeile hat.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

19.04.2017, 17:54

Außerdem muss dein 'weapon' als const char* definiert werden, schließlich weist du dem zeiger die adresse eines speicherbereichs zu, welcher nur gelesen werden darf.

Azasel

unregistriert

7

19.04.2017, 21:41

Ich tippe mal darauf, dass du ein /n aus der vorherigen Eingabe im buffer hast.

In Zeile 24 wird doch nur ein char eingelesen, in meinem Fall das 's', das bestätige ich dann mit Enter, wieso soll jetzt aber das Enter bzw. \n mit als Eingabe zählen?

scanf() statt getchar() schafft hier Abhilfe

Schon, aber wäre in meinem Fall getchar() nicht mehr angebracht?

Nun, 'übersprungen' wird da nix, prüf doch mal mit dem Debugger welchen Wert 'input' dann nach der Zeile hat.

Ich habe noch nie mit einem Debugger gearbeitet, ist es Zeitaufwenig den Umgang mit dem Debugger zu erlernen?

Außerdem muss dein 'weapon' als const char* definiert werden, schließlich weist du dem zeiger die adresse eines speicherbereichs zu, welcher nur gelesen werden darf.

Meinst du das, weil weapon in meinem Fall ein Stingliteral ist?
Ich habe die Zeile Code bereits geändert(um den Buffer-Overflow zu vermeiden).

C-/C++-Quelltext

1
 char weapon[12] = "keine";

Das 'const' Schlüsselwort kann man doch weglassen, denke ich mal.

Gut, dann gehe ich jetzt noch mal den Code durch um die Fehler zu bereinigen.

@zimmer

Alter Hase

Beiträge: 1 135

Wohnort: NRW Germany

  • Private Nachricht senden

8

19.04.2017, 22:53

if(opt == 's'){
shop(weapon);
}
else
if(opt == 'v'){
menu = 0;
}

ich finde du kanst das else in zeile 29 entfernen
edit: oder was hast Du da noch vor?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »@zimmer« (19.04.2017, 23:58)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

20.04.2017, 06:33

In Zeile 24 wird doch nur ein char eingelesen, in meinem Fall das 's', das bestätige ich dann mit Enter, wieso soll jetzt aber das Enter bzw. \n mit als Eingabe zählen?
Weil jede Taste, die du drückst, im Eingabepuffer landet. Dazu zählt auch Enter.


Ich habe noch nie mit einem Debugger gearbeitet, ist es Zeitaufwenig den Umgang mit dem Debugger zu erlernen?
Nö, ist nicht aufwendig. Im Gegenteil, die investierte Zeit bekommst du fast direkt wieder eingespart. Dieses Thema hier wäre komplett überfüssig gewesen.

Das 'const' Schlüsselwort kann man doch weglassen, denke ich mal.
Kann man, ist aber falsch. Wundert mich, dass das überhaupt kompiliert. Ein char* ist nunmal kein const char*.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Azasel

unregistriert

10

20.04.2017, 11:30

Danke sehr für eure Hilfe :thumbsup:

Werbeanzeige