Unbekannter Fehler - Anfänger sucht Hilfe :)
-
Moin!
Ich bin noch ein Frischling in C, also seid bitte gnädig mit mir.
Ich bin gerade dabei dieses Tutorial zu befolgen: C-HowToDabei habe ich nun zwei Probleme.
1. Kann ich den im Tutorial benutzen scanf Befehl nicht nutzen. Visual Studio 2013 wirft mir jedesmal diese Fehlermeldung aus:error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
2. Wenn ich nun scanf_s nutze bekomme ich diese Fehlermeldungen:
error C4700: Die nicht initialisierte lokale Variable "wert1" wurde verwendet.
error C4700: Die nicht initialisierte lokale Variable "wert2" wurde verwendet.Daraufhin habe ich die beiden Variablen einfach mit 0 initialisert, doch dann bekam ich diese Fehlermeldung:
fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
So... Meine Frage ist jetzt wie ich das ganze beheben kann. Ich schätze mal, dass ich da irgendeinen Anfängerfehler gemacht habe.
Hier ist mein Code:#include<stdio.h> int main() { float wert1, wert2; printf("Taschenrechner v0.1"); printf("\nBitte geben Sie die erste Zahl ein: "); scanf_s("%f", wert1); printf("Bitte geben Sie die zweite Zahl ein: "); scanf_s("%f", wert2); float summe = wert1 + wert2; printf("\nDie Summe aus %f und %f ist %f.", wert1, wert2, summe); getchar(); }
Danke für eure Hilfe!
-
scanf benötigt die Adresse der Variablen, nicht die Variable selbst.
Du brauchst den Adressoperator &.scanf_s("%f", &wert1);
-
In diesem Fall ist die Benutzung von scanf_s nicht sicherer.
Das bezieht sich nur auf die Formatspecifier c, C, s und S.
http://msdn.microsoft.com/de-de/library/w40768et.aspx
Und auch da ist sie nur sicherer, wenn du da die richtige Größe vom Puffer übergibst.Im übrigen wird das mit dem & auch so in dem Tutorial angesprochen.
-
Danke für eure Antworten!
Das & habe ich ja ganz übersehen.Ich habe das jetzt korrigiert, bekomme jedoch trotzdem noch diese Fehlermeldung:
fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.Auch wenn scanf_s nicht wirklich sicherer ist als scanf, so kann ich letzteres nunmal leider nicht benutzen.
-
Nowaepon schrieb:
Ich habe das jetzt korrigiert, bekomme jedoch trotzdem noch diese Fehlermeldung:
fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.Und welches Symbol ist das? Das gibt der Linker auch noch aus.
Nowaepon schrieb:
Auch wenn scanf_s nicht wirklich sicherer ist als scanf, so kann ich letzteres nunmal leider nicht benutzen.
Warum nicht?
Was du machen kannst steht doch da:Compiler schrieb:
To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Du kannst das _CRT_SECURE_NO_WARNINGS in den Projektoptionen definieren
Sonst frag Google nach C4996 _CRT_SECURE_NO_WARNINGS
-
Das Symbol gibt er leider nicht aus.
Hier ist der gesamte Inhalt der Fehlerkonsole:1>------ Erstellen gestartet: Projekt: Test1, Konfiguration: Debug Win32 ------
1> Taschenrechner.c
1>Test.obj : error LNK2005: _main ist bereits in Taschenrechner.obj definiert.
1>C:\Users\Nowaepon\documents\visual studio 2013\Projects\CHowTo\Debug\Test1.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========Ich kann auch nicht per Fehlerkonsole zu dem Fehler im Code springen. Sehr merkwürdig.
Google werde ich dann jetzt auch mal bemühen (wegen scanf).
-
Nowaepon schrieb:
Das Symbol gibt er leider nicht aus.
Aber
Nowaepon schrieb:
Test.obj : error LNK2005: _main ist bereits in Taschenrechner.obj definiert.
Du hast da zwei Dateien in deinem Projekt: Test und Taschenrechner.
Und in beiden hast du ein main.Und dein fertiges Programm heißt Test1.exe. Da hast du wohl etwas viel rum gespielt.
Mach ein neues Projekt. Nenn das Taschenrechner und dann kopierst du da deinen Code rein.
-
Hmmm Problem gefunden.
Wenn ich natürlich in einer anderen Datei auch schon main habe ist das nicht gerade förderlich.Dafür habe ich jetzt aber ein ganz anderes Problem.
Mit \n setzt man ja einen Absatz. Der erste Absatz in meinem Code wird aber nicht gesetzt.
Außerdem beendet sich das Programm sofort selbst sobald die zweite Zahl bestätigt wurde. Obwohl getchar() das ja verhindern sollte.
-
Ein neues Projekt werde ich dann auch noch einmal anlegen. Vielleicht behebt das ja die anderen Probleme.
-
Nowaepon schrieb:
Mit \n setzt man ja einen Absatz. Der erste Absatz in meinem Code wird aber nicht gesetzt.
Welcher soll das sein?
Nowaepon schrieb:
Außerdem beendet sich das Programm sofort selbst sobald die zweite Zahl bestätigt wurde. Obwohl getchar() das ja verhindern sollte.
Das getchar liest das '\n' von der Entertaste ein.
Wie startest du das Programm?
-
Nowaepon schrieb:
Mit \n setzt man ja einen Absatz. Der erste Absatz in meinem Code wird aber nicht gesetzt.
Es ist unklar, was du mit Absatz meinst:
Heading TextTextText
oder
Heading TextTextText
?
Für letzteres brauchst du zwei '\n', denn das gibt nur einen einzelnen Zeilenumbruch aus.
-
Mit Absatz meinte ich dein zweites Beispiel Nathan. Mit einem zweitem \n klappts einwandfrei.
Danke für die Info mit der Enter-Taste. Die habe ich dann gleich mal ausmaskiert.
Jetzt klappt alles bestens.Kennt ihr eigentlich einen Weg um nur X Stellen einer Variable anzuzeigen?
Gegenwärtig habe ich etliche 0 an meinem Ergebnis hängen. Das würde ich gerne für die anzeige verringern.
Im Tutorial stand bisher nur etwas um die Variablen zu verlängern.
-
Nowaepon schrieb:
Kennt ihr eigentlich einen Weg um nur X Stellen einer Variable anzuzeigen?
Gegenwärtig habe ich etliche 0 an meinem Ergebnis hängen. Das würde ich gerne für die anzeige verringern.
Im Tutorial stand bisher nur etwas um die Variablen zu verlängern.Indem du die Formatmöglichkeiten von
printf
ausnutzt.
Welche es gibt, kannst du z.B. da http://www.cplusplus.com/reference/cstdio/printf/ nachlesen.printf("\nDie Summe aus %.3f und %.3f ist %.3f.", wert1, wert2, summe)
Oder, wenn es wirklich X sein soll
int X = 3; printf("\nDie Summe aus %.*f und %.*f ist %.*f.", wert1, X, wert2, X, summe, X)
-
Alles klar, danke dir!
Jetzt sit alles so wie es sein soll.Nochmals danke für eure Geduld mit mir.