Frage von frankstein350, 16

Was ist eine alternative von scanf in C/Linux?

Hallo, ich habe gerade mit der C-Programmierung begonnen und habe nun ein Problem, dass ich gerne Zahlen einlesen möchte, mein Programm dabei aber immer abstürzt. Immer wegen dem scanf() stürzt es ab. Ich habe es nun mit fflush() versucht und das hat für die erste Zahl geholfen nur bei der zweiten stürzt es immer noch ab. Unter Windows und Mac OS hab ich es schon versucht da hat es auch funktioniert nur unter Linux nicht. Kann mir jemand einen Tipp geben. Hier ist der Quellcode, ich hoffe er wird richtig formatiert angezeigt. Aso und Entwicklungsumgebung ist Qt-Creator.

include

int main() {

float x = 0;

float y = 0;
printf("\n\t1 . R e c h e n p r o g r a m m\n");
printf("\nBitte x eingeben :");
fflush(NULL);
scanf("%f",&x);
printf("Bitte y eingeben :");
fflush(NULL);
scanf("%f",&y);
printf("\n %f + %f ist %f",x,y,x+y);
printf("\n %f - %f ist %f",x,y,x-y);
printf("\n %f * %f ist %f",x,y,x*y);
printf("\n %f / %f ist %f",x,y,x/y);
return 0;

}

Antwort
von surbahar53, 16

Ich nehme an, dass im Falle von Linux die C-Libs nicht zu dem erzeugten Code passen. Nimmt z.B. der Compiler an, das Zielsystem hätte 32 bit, dann ist das zweite Argument von scanf() ein 32bit Pointer. Wird dann eine Lib dazu gebunden, die einen 64bit Pointer erwartet, wird es zu einem Adressfehler kommen, und natürlich auch umgekehrt.

Ich arbeite schon lange nicht mehr mit C bzw. Linux, kann also nicht schnell nachvollziehen, ob eine Mischung verschiedener Architekturen bezüglich Source und Lib vom Linker überhaupt akzeptiert wird.

Ist also nur eine Vermutung. Am Source erkenne ich jedenfalls keine Fehler.

Kommentar von ralphdieter ,

Bestätigt: Der Code compiliert bei mir unter Ubuntu Trusty mit:

 gcc -std=c99 -ansi -Wall -Wextra -Wpedantic 

und läuft astrein.

An scanf() liegt es also sicher nicht...

@frankenstein: Welche Meldung kommt denn beim Absturz?

Kommentar von frankstein350 ,

Mhm das ist echt komisch. Ja das Programm liefert garnichts ala dauerschleufe, bis ich es dann beende. Wenn ich das mache kommt "Programm abgestürzt". Als ich scanf() weg gelassen habe, hat alles geklappt klar dann waren die Werte 0 aber ich versteh nicht woran das liegt.

Kommentar von ralphdieter ,

Ich vermute, dass Qt-Creator eine eigene Variante von main() hat, und Du da dazwischen funkst.

Klappt's denn wenigstens in einem normalen Terminal?

Kommentar von frankstein350 ,

Nein wenn ich das ausführe kommt einmal Zahl eingeben wenn ich diese dann eingebe kommt sie einmal drunter und dann 1:PAUSE: not found

Kommentar von frankstein350 ,

Also es lag wirklich an der Entwicklungsumgebung. Die Compiler funktionieren richtig unter Geany hat es auch funktioniert mit gcc und g++ nur unter Qt nicht. Trotzdem danke für die Hilfe jetzt muss ich mal schauen was da schief gelaufen ist. 

Expertenantwort
von guenterhalt, Community-Experte für Linux, 14

abgesehen davon, dass x nicht deklariert ist, gibt es keinen Fehler. So wie du es geschrieben hast, wird es mit c++  ( g++-4.8) ohne Fehler kompiliert und a.out stürzt auch nicht ab.

Installiere den Compiler einfach noch einmal.

 

Kommentar von guenterhalt ,

noch eine Bemerkung:

hast du die Code-Datei  von deinem Windows-PC?
Windows benutzt eine andere Zeilen-Ende-Kennung.
mit 0d0a statt 0d habe ich schon die merkwürdigsten Fehler erhalten.
Dumm dabei ist, man sieht das nicht mit jedem Editor. Erst mit ghex konnte ich das nachweisen.

(float x = 0; außerhalb des Codes hatte ich übersehen)

Kommentar von frankstein350 ,

Also das Buch wo ich gerade durch nehme, wird alles unter Windows gemacht. Unter Mac OS hab ich es auch zum laufen gebracht nur unter Ubuntu nicht. Leider kommt auch keine brauchbare Fehlermeldung

Kommentar von frankstein350 ,

Also es lag wirklich an der Entwicklungsumgebung. Die Compiler funktionieren richtig unter Geany hat es auch funktioniert mit gcc und g++ nur unter Qt nicht. Trotzdem danke für die Hilfe jetzt muss ich mal schauen was da schief gelaufen ist. 

Antwort
von frankstein350, 12

So sieht die Fehlermeldung aus nachdem ich das Programm beendet habe.

Kommentar von frankstein350 ,

Main aber bitte nicht berücksichtigen. Da hab ich nur etwas versucht, diese ist normal leer.

Antwort
von DataWraith, 11

Hat es da nicht mal sowas wie 'inputf()' gegeben?

Kommentar von frankstein350 ,

Danke für die Info, hab danach mal gesucht aber leider kaum was gefunden.

Kommentar von DataWraith ,

Hast Du mal mit getchar() versucht?

Kommentar von frankstein350 ,

Ja leider selbes Problem.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten