%d und %c!
-
Hab hier nen Problem mit scanf();. Also ich will ein Programm schreiben was sich öffnet und dann direkt nach deinem Namen fragt. Danach soll das programm hallo sagen! also { Hallo "name"}. Mein code sieht jetz so aus:
# include <stdio.h> # include <stdlib.h> int main() { int name; printf("Geben Sie ihren Namen ein: "); scanf("%c", &name); printf("Hallo %c.\n",name); printf("\n"); system("pause"); }
Also hab ich das bei scanf() mit %c gemacht und nicht mit %d weil das ja für ganze Zahlen ist oder? Aber wenn man jetz einen Namen eingibt, dan sagt der z.B. Hallo a!!!
Also der nimmt immer nur den ersten Buchstaben an. Wie mache ich das jetz, dass er komplette zeichenketten? annimmt?
-
"int name" ist eigentlich ja eine Zahl (integer).Ist dir klar dass du versuchst einen Namen mit mehreren Buchstaben in eine Zahlvariable einzulesen
?
und dann auch mit %c was ja schon explizit nur ein Zeichen (Char=>passt schon mal nicht zu Int) einliest?
hier ist eine funktionierende Version:# include <stdio.h> int main() { char name[20];// ein Feld mit 20 Zeichenplätzen reservieren. printf("Geben Sie ihren Namen ein: "); scanf("%s", &name); printf("Hallo %s.\n",name); printf("\n"); getchar(); //ist schöner als PAUSE,da PAUSE ja kein ANSI C ist ;) return 0; //wenn int main dann schon ein return. }
Ok, wenn man jetzt einen Namen mit 30-40 Zeichen eingibt, dann erlebt man eine Überaschung
aber darauf einzugehen wäre IMHO etwas zuviel für den Anfang.
-
Danke für die Schnelle Antwort. Funktioniert jetz auch also muss ich immer %s nehmen und das halt vorher anstelle von int mit char[]; deklarieren.
Das mit dem
getchar(); return 0;
funktioniert bei mir aber irgendwie nie.... system("pause"); hingegen funktioniert immer!...
-
CDW schrieb:
getchar(); //ist schöner als PAUSE,da PAUSE ja kein ANSI C ist ;)
- PAUSE an sich kann kein ANSI C sein, weil PAUSE überhaupt kein C Befehl/Funktion/Makro/usw. ist.
- system("PAUSE") ist sehr wohl ANSI C, da system ein Teil des C Standards ist.
- system("PAUSE") ist nicht portabel, d.h. funktioniert nicht überall und nicht immer.
- getchar() ist gar nicht ANSI C, weil getchar() in conio.h für WinDOS und in (n)curses.h für Unix enthalten ist, und wenn diese Funktion benutzt wird, dann muss entweder conoio.h oder ncurses.h (abhängig vom OS) includiert werden.
@Gizm: %c liest und schreibt ein einzelnes Zeichen. %s liest und schreibt Zeichenketten (strings). scanf("%s") liest jedoch alle Zeichen bis einem Leerzeichen oder \0. scanf("%s", buffer); wurde bei folgender Eingabe Hallo, Welt nur Hallo, lesen. " Welt" bleibt im Puffer. Außerdem hat man so keine Kontrolle, wie groß das eingegebene Wort sein wird, bsp:
char name[10]; printf("Geben Sie Ihren Namen ein (max. 9 Zeichen): "); scanf("%s", name);
und ich mache folgende Eingabe: Parangaricutirimicuaro (22 Zeichen) dann gibt es ein buffer overflow, weil 22 Zeichen nicht in name[10] (dort passen strings mit maximaler Länge 9) passen. Deshalb ist es besser man: fgets(3) zu nehmen, weil man damit die Kontrolle über die Länge der Eingabe hat.
- PAUSE an sich kann kein ANSI C sein, weil PAUSE überhaupt kein C Befehl/Funktion/Makro/usw. ist.
-
supertux schrieb:
[*] getchar() ist gar nicht ANSI C, weil getchar() in conio.h für WinDOS und in (n)curses.h für Unix enthalten ist, und wenn diese Funktion benutzt wird, dann muss entweder conoio.h oder ncurses.h (abhängig vom OS) includiert werden.
wäre mir neu.
meinst du getch?
-
Shade Of Mine schrieb:
supertux schrieb:
[*] getchar() ist gar nicht ANSI C, weil getchar() in conio.h für WinDOS und in (n)curses.h für Unix enthalten ist, und wenn diese Funktion benutzt wird, dann muss entweder conoio.h oder ncurses.h (abhängig vom OS) includiert werden.
wäre mir neu.
meinst du getch?ja,
ich meinte getch, hab was verwechselt (passiert wenn man 3 Uhr morgens antwortet)
-
[quote="supertux"]
CDW schrieb:
und ich mache folgende Eingabe: Parangaricutirimicuaro (22 Zeichen) dann gibt es ein buffer overflow, weil 22 Zeichen nicht in name[10] (dort passen strings mit maximaler Länge 9) passen. Deshalb ist es besser man: fgets(3) zu nehmen, weil man damit die Kontrolle über die Länge der Eingabe hat.
Also lieber fgets() anstatt scanf()?
Wegen dem getchar(); . in einem Buch stand drinn, dass man das getchar() benutzen solltwe wenn man unter Linux progt...