PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Chars



tampa
03-03-2008, 12:45
Hallo,

Ich bin Anfänger bzgl. C und bin grad dabei ein bisschen zubasteln. Ich hab ein klitze kleines C-Programm geschrieben, was 2 Zahlen und einen Buchstaben einlesen, und danach wieder ausgeben soll. Leider funktioniert das nicht so wie es soll. Der Compiler (GCC 4.1.2) gibt keine Fehler aus.

Hier das Programm:

#include <stdio.h>

void main ()

{

int a;
int b;
char c;


scanf("%d",&a);
scanf("%c",&c);
scanf("%d",&b);
printf("\nIch gab ein: %d, %c und %d\n",a,c,b);


}
Hier zum Beispiel mal ein Durchlauf

tobias@Gentoo ~ $ ./a.out
2 e 2

Ich gab ein: 2, und -1208205324

Ehrlich gesagt, ich weiß absolut nicht warum das nicht geht. Wenn ich 3 Char´s speichern will, geht´s ja auch. Oder ist es nicht möglich Zahlen und Chars "zusammen" zu speichern?

peschmae
03-03-2008, 13:48
Dein Problem liegt folgendermassen:

Der String "2 e 2" wird vom ersten scanf verarbeitet - das liest die zwei, stellt fest das nachher die Zahl fertig ist und lässt den String so.

Also ist der jetzt " e 2" - man lege sein Augenmerk auf den Space vor dem e. Das nächste, zweite, scanf liest den nächsten Character - also den space " ".

Jetzt folgt das letzte scanf, das möchte eine Zahl lesen, kriegt aber "e 2" als Input und kann entsprechend keine Zahl lesen...

Was funktioniert ist z.B.


scanf("%d",&a);
scanf("%c",&c);
scanf("%c",&c);
scanf("%d",&b);

Das setzt natürlich voraus dass der Benutzer genau einen Whitespace zwischen der 2 und dem e stehen hat - also besser ne Schleife basteln und/oder überprüfen ob der gelesene Char einem der erwarteten (a-z,A-Z oder so) entspricht.

Wichtig in dem Zusammenhang ist auch der Rückgabewert von scanf; der gibt an ob ob bzw. wieviele Sachen gelesen werden konnten. - Bei deinem Beispiel sind die 1 für Aufrufe eins und zwei und 0 für den letzten...

Was noch besser geht und kürzer ist ist das hier:


int ret = scanf("%d %c %d",&a, &c, &b);
printf("\nIch gab ein: %d, %c und %d; Anzahl korrekt verarbeiteter Eingaben: %d\n",a,c,b, ret);


Da werden auch gleich verschiedene und/oder mehrfache Whitespaceeingaben zwischen den Argumenten "richtig" gehändelt.

MfG Peschmä

tampa
03-03-2008, 14:11
Dank dir!

Klappt jetzt wunderbar und ich hab noch etwas gelernt :-)