Zugriffsverletzung beim Schreiben an Position
-
Hey Leute, bin grad dabei n Spielchen zu schreiben habe allerdings Probleme beim Schreiben der Namen in ein Struct Objekt.
struct sSpieler { char cName[16]; float fGeld; int iPosition; bool bAussetzen; int iAusgeschieden; }; sSpieler S1 = { "Spieler 1", 6000000.0F, 1, false, 1 }; . . . . . sSpieler S10 = { "Spieler 10", 6000000.0F, 1, false, 1 }; sSpieler aSpieler[10] = { S1, S2, S3, S4, S5, S6, S7, S8, S9, S10 };
Jetzt will ich aber nicht dass der Spieler- Spieler 1 heißt sondern
das jeder Spieler sich selbst einen Namen geben kann. dann wollte ich das mitprintf("\nGeben sie Spieler %i's Namen ein ->", 1); scanf_s("%s", &aSpieler[0].cName); fflush(stdin);
lösen. Quasi nur mal vom ersten Spieler den Namen ändern.
Aber nach der eingabe gibts ne Fehlermeldung.Ausnahme ausgelöst bei 0x0F4AC71D (ucrtbased.dll) in Monopoly2.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00CE1000.
Aber warum? Versteh ich irgendwie nicht
Hoffe mir kann jemand helfen und auch das Problem dahinter erklären
Grüße klixxx
-
Benutze std::string statt char-Arrays.
Benutze std::vector statt array.
Benutze iostream statt printf/scanf.Microsoft schrieb:
Anders als scanf und wscanf erfordern scanf_s und wscanf_s eine Angabe der Puffergröße für alle Eingabeparameter
Wo ist das bei dir?
-
&aSpieler[0].cName sollte &aSpieler[0].cName[0] oder aSpieler[0].cName sein.
-
manni66 schrieb:
Benutze std::string statt char-Arrays.
Benutze std::vector statt array.
Benutze iostream statt printf/scanf.std::string und std:vector sind mir ehrlicherweiße gar kein Begriff.
Studiere gerade Informatik im ersten Semster und unser Prof bringt uns das halt mit den Methoden bei, wie ich sie geschrieben habe.manni66 schrieb:
Microsoft schrieb:
Anders als scanf und wscanf erfordern scanf_s und wscanf_s eine Angabe der Puffergröße für alle Eingabeparameter
Wo ist das bei dir?
Unser Prof meinte dass das scanf_s von microsoft eingeführt wurde weil das scanf normal zu unsicher gewesen sei. Wir sollen entweder _crt_secure_no_warnings in den Präprozessor als Ausnahme hinzufügen oder halt scanf_s benutzen. Da von der zitierten Nachricht von Microsoft nix von scanf angegeben war hab ich oben besagtes getan - die Ausnahme hinzugefügt und scanf anstatt scanf_s benutzt. Jetzt funktioniert es auch.
for (int i = 0; i < iAnzahlSpieler; i++) { printf("\nGeben sie Spieler %i's Namen ein ->", i+1); scanf("%s", aSpieler[i].cName); fflush(stdin); } for (int i = 0; i < iAnzahlSpieler; i++) { printf("\nSpieler: %s", aSpieler[i].cName); }
Liegt das daran dass ich keine Puffergröße definiert habe? Wenn ja was ist das überhaupt?
Grüße klixxx
PS. Dank dir tausend mal, ohne dich wäre ich da womöglich nicht drauf gekommen
-
YAIT (yet another incompetent teacher)
Liegt das daran dass ich keine Puffergröße definiert habe? Wenn ja was ist das überhaupt?
Ja. Das ist der Witz an scanf_s: du sagst, wieveiele Zeichen überhaupt in das Array passen. Gibt der Benutzer mehr ein, gibt es trotzdem keinen Überlauf.
Bei mir generiert der Compiler eine Meldung:
scan.cpp(7): warning C4473: 'scanf_s' : not enough arguments passed for format string
scan.cpp(7): note: placeholders and their parameters expect 2 variadic arguments, but 1 were provided
scan.cpp(7): note: the missing variadic argument 2 is required by format string '%s'
scan.cpp(7): note: this argument is used as a buffer size
-
manni66 schrieb:
YAIT (yet another incompetent teacher)
Sehr vorschnelles Urteil.
Da überhaupt nichts c++ ist, könnte der Beitrag auch lediglich im falschen Unterform sein.Also Threadsteller, C oder C++? Was macht ihr?
-
Jockelx schrieb:
manni66 schrieb:
YAIT (yet another incompetent teacher)
Sehr vorschnelles Urteil.
Da überhaupt nichts c++ ist, könnte der Beitrag auch lediglich im falschen Unterform sein.Also Threadsteller, C oder C++? Was macht ihr?
Wir lernen im allgemeinen C++, zumindest steht das in allen Vorlesungsunterlagen drin.
manni66 schrieb:
YAIT (yet another incompetent teacher)
Ich denke er hat schon Ahnung, er hat seine eigene Firma die diverse Sachen Programmieren. Aber das sei mal dahin gestellt
manni66 schrieb:
Ja. Das ist der Witz an scanf_s: du sagst, wieveiele Zeichen überhaupt in das Array passen. Gibt der Benutzer mehr ein, gibt es trotzdem keinen Überlauf.
Das hab ich auch schon bemerkt, habs grad ausprobiert, mit 1 bei Scanf_s und er hat den kompletten Namen trotzdem ohne zu meckern genommen. Vielen lieben Danke für deine Hilfe!
-
klixxx schrieb:
Wir lernen im allgemeinen C++, zumindest steht das in allen Vorlesungsunterlagen drin.
manni66 schrieb:
YAIT (yet another incompetent teacher)
Ich denke er hat schon Ahnung, er hat seine eigene Firma die diverse Sachen Programmieren. Aber das sei mal dahin gestellt
Das, was du hier schreibst, hat mit (modernem) C++ absolut gar nichts mehr zu tun.
Zu der Kompetenz des Professors möchte ich mich mal nicht äußern. Es kommt halt nur sehr oft vor, dass Professoren ihre Vorlesungsunterlagen einmal erstellen und dann die nächsten 30 Jahre verwenden, ohne darauf zu achten, ob der Inhalt noch zeitgemäß ist.
Und dass er eine eigene Firma hat, muss nichts heißen. Kann sein, dass er da seine Angestellten hat, die die Programmierarbeit übernehmen und er selbst nur bei der Architektur arbeitet. Kann aber auch sein, dass da knallhart C programmiert wird
-
daddy_felix schrieb:
klixxx schrieb:
Wir lernen im allgemeinen C++, zumindest steht das in allen Vorlesungsunterlagen drin.
manni66 schrieb:
YAIT (yet another incompetent teacher)
Ich denke er hat schon Ahnung, er hat seine eigene Firma die diverse Sachen Programmieren. Aber das sei mal dahin gestellt
Das, was du hier schreibst, hat mit (modernem) C++ absolut gar nichts mehr zu tun.
Zu der Kompetenz des Professors möchte ich mich mal nicht äußern. Es kommt halt nur sehr oft vor, dass Professoren ihre Vorlesungsunterlagen einmal erstellen und dann die nächsten 30 Jahre verwenden, ohne darauf zu achten, ob der Inhalt noch zeitgemäß ist.
Und dass er eine eigene Firma hat, muss nichts heißen. Kann sein, dass er da seine Angestellten hat, die die Programmierarbeit übernehmen und er selbst nur bei der Architektur arbeitet. Kann aber auch sein, dass da knallhart C programmiert wird
Das kann natürlich alles zutreffen, ich berichte in 7 Semstern wenn ich meinen Abschluss habe, ob ich was aufm Arbeitsmarkt taug oder nicht
Danke an alle die mir geholfen haben