char variable soll zahlen bis 255 speichern und ausgeben
-
int main(void) { unsigned char zahl=0; printf("Geben Sie eine zahl ein: "); scanf("%d",&zahl); printf("Sie gaben ein : %d",zahl); return 0; }
gebe ich z.B. "33" ein bekomme ich als Ausgabe "51". OK die 33 wird als hexwert interpretiert nehme ich mal an und die Ausgabe ist eben die dezimale Zahl 55, doch wie schaffe ich es, dass die eingegebene Zahl als dezimal interpretiert wird, damit die Ausgabe auch stimmt? Ich könnte auch short nehmen, doch mit char spare ich 1 Byte
-
zahl muss ein 'int' sein (scanf will es so bei %d).
-
Der format specifier %d beim scanf() ist für int gedacht, nicht für char. Da wird nichts als Hex interpretiert, da wird schlicht an eine Stelle im Speicher geschrieben auf die du nicht schreiben darfst. Korrekt wäre %hhd.
-
Tim schrieb:
Der format specifier %d beim scanf() ist für int gedacht, nicht für char. Da wird nichts als Hex interpretiert, da wird schlicht an eine Stelle im Speicher geschrieben auf die du nicht schreiben darfst. Korrekt wäre %hhd.
In meinen Buch C von a-z steht, dass bei char mit Verwendung von %d die Zahl in seiner tatsächlichen Form ausgegeben wird also nicht umgewandelt sprich eingabe: 100 == ausgabe: 100 demnach ist das Beispiel im Buch FALSCH!
Danke Tim %hhd damit gehts, komisch das in meinem 1300 seiten Kompendium nichts über %hhd kommt... hast du eine gute deutsche quelle über dieses hhd Formatzeichen? Google bringt da nix außer c-plusplus.net links
-
Pelle schrieb:
In meinen Buch C von a-z steht, dass bei char mit Verwendung von %d die Zahl in seiner tatsächlichen Form ausgegeben wird also nicht umgewandelt sprich eingabe: 100 == ausgabe: 100 demnach ist das Beispiel im Buch FALSCH!
dieses buch ist bekannt dafür, voller fehler zu sein. da hst du leider einen fehlkauf getätigt.
-
Pelle schrieb:
In meinen Buch C von a-z steht, dass bei char mit Verwendung von %d die Zahl in seiner tatsächlichen Form ausgegeben wird also nicht umgewandelt sprich eingabe: 100 == ausgabe: 100 demnach ist das Beispiel im Buch FALSCH!
btw, richtig lesen
Es stimmt das bei %d die 100 korrekt ausgegeben wird, weil der compiler den char einfach implizit auf int casted. Und char nach int passt halt immer (weil char idr 8 byte hat, int mindestens 16).
Anders aber ist das bei scanf. Wenn Du mal _genau_ hinschaust gibst Du beim scanf die ADRESSE der Variablen an, und nicht wie beim printf die Variable selbst. Der scanf erwartet das sich an dieser Adresse ein int (also mindestens 16 bit) befinden, du hast aber nur 8 Bit reserviert.
Genaugenommen ist das Beispiel im Buch nicht falsch, Du hast es eher fälschlicherweise auf scanf üebrtragen was aber nicht geht ;))
-
loks schrieb:
Pelle schrieb:
In meinen Buch C von a-z steht, dass bei char mit Verwendung von %d die Zahl in seiner tatsächlichen Form ausgegeben wird also nicht umgewandelt sprich eingabe: 100 == ausgabe: 100 demnach ist das Beispiel im Buch FALSCH!
btw, richtig lesen
Es stimmt das bei %d die 100 korrekt ausgegeben wird, weil der compiler den char einfach implizit auf int casted. Und char nach int passt halt immer (weil char idr 8 byte hat, int mindestens 16).
Anders aber ist das bei scanf. Wenn Du mal _genau_ hinschaust gibst Du beim scanf die ADRESSE der Variablen an, und nicht wie beim printf die Variable selbst. Der scanf erwartet das sich an dieser Adresse ein int (also mindestens 16 bit) befinden, du hast aber nur 8 Bit reserviert.
Genaugenommen ist das Beispiel im Buch nicht falsch, Du hast es eher fälschlicherweise auf scanf üebrtragen was aber nicht geht ;))
Im Buch ist aber von scanf die Rede also ist das Beispiel falsch.
-
Pelle schrieb:
Tim schrieb:
Der format specifier %d beim scanf() ist für int gedacht, nicht für char. Da wird nichts als Hex interpretiert, da wird schlicht an eine Stelle im Speicher geschrieben auf die du nicht schreiben darfst. Korrekt wäre %hhd.
In meinen Buch C von a-z steht, dass bei char mit Verwendung von %d die Zahl in seiner tatsächlichen Form ausgegeben wird also nicht umgewandelt sprich eingabe: 100 == ausgabe: 100 demnach ist das Beispiel im Buch FALSCH!
Was mich bei dem Buch nicht wundern würde. Kannst mal zeigen wo das in der Online-Version steht?
Pelle schrieb:
Danke Tim %hhd damit gehts, komisch das in meinem 1300 seiten Kompendium nichts über %hhd kommt... hast du eine gute deutsche quelle über dieses hhd Formatzeichen? Google bringt da nix außer c-plusplus.net links
Am besten manpages lesen. z.B. hier -> man: scanf bzw. man: scanf/de
-
Tim schrieb:
Pelle schrieb:
Tim schrieb:
Der format specifier %d beim scanf() ist für int gedacht, nicht für char. Da wird nichts als Hex interpretiert, da wird schlicht an eine Stelle im Speicher geschrieben auf die du nicht schreiben darfst. Korrekt wäre %hhd.
In meinen Buch C von a-z steht, dass bei char mit Verwendung von %d die Zahl in seiner tatsächlichen Form ausgegeben wird also nicht umgewandelt sprich eingabe: 100 == ausgabe: 100 demnach ist das Beispiel im Buch FALSCH!
Was mich bei dem Buch nicht wundern würde. Kannst mal zeigen wo das in der Online-Version steht?
Pelle schrieb:
Danke Tim %hhd damit gehts, komisch das in meinem 1300 seiten Kompendium nichts über %hhd kommt... hast du eine gute deutsche quelle über dieses hhd Formatzeichen? Google bringt da nix außer c-plusplus.net links
Am besten manpages lesen. z.B. hier -> man: scanf bzw. man: scanf/de
zitat:"char a = 65;
Verwenden Sie jetzt im Programm das Formatierungszeichen %c, wird der Wert 65 anhand der ASCII-Code-Tabelle kodiert. Wird hierbei das Formatierungszeichen %d verwendet, würde dieser Wert nicht kodiert und in seiner tatsächlichen Form ausgegeben, wobei »tatsächliche Form« natürlich rein optisch gemeint ist. In Wirklichkeit wäre die tatsächliche Form eine Zahlenkolonne von Einsen und Nullen. Für den PC gelten weiterhin nur Bits und Bytes. Und wie Sie gesehen haben, funktioniert das analog auch mit dem Datentyp int."
ganz runter scrollen: http://www.galileo-press.de/openbook/c_von_a_bis_z/c_007_007.htm#RxxobKap0070070400263C1F01E18C
also ich finde das buch sonst an für sich gut. danke für die man links!
-
Pelle schrieb:
http://www.galileo-press.de/openbook/c_von_a_bis_z/c_007_007.htm#RxxobKap0070070400263C1F01E18C
Ermmm, da steht aber nichts von scanf()
-
Tim schrieb:
Pelle schrieb:
http://www.galileo-press.de/openbook/c_von_a_bis_z/c_007_007.htm#RxxobKap0070070400263C1F01E18C
Ermmm, da steht aber nichts von scanf()
ja gut nicht direkt, doch in den Übungen davor wurde immer scanf benutzt für die Beispiele von daher schließt man da automatisch drauf... es hätte vom Autor dann erwähnt werden sollen, dass dies mit scanf net geht wobei wenns nicht mit scanf geht das %d mit was sonst?
-
Didaktisch ist das Buch sicher nicht der Überflieger.
-
Tim schrieb:
Didaktisch ist das Buch sicher nicht der Überflieger.
da stimme ich dir sogar zu, manch gelbes dummie buch finde ich z.B. von der grafischen aufbereitung, typo und didaktik besser.
kennst du denn ein didaktisch gutes deutsches C buch für Anfänger?
-
Pelle schrieb:
kennst du denn ein didaktisch gutes deutsches C buch für Anfänger?
Leider nein. Aber muss es denn unbedingt deutsch sein?
-
das finde ich gut: http://publications.gbdirect.co.uk/c_book/
(ist aber nicht auf deutsch).