Problem mit char
-
Hallo, bin neu hier im Forum und auch ein Neuling der Programmierung. Ich habe als aufgabe bekommen in der Konsole eine Zahl,eine Kommazahl, ein Zeichen mit ASCII und eine Zeichenkette einlesen und ausgeben zu lassen.
Habe es wie folgt geschrieben
#include <conio.h> #include <stdio.h> #include <float.h> #include <wchar.h> #include <tchar.h> int main(void) { int zahl1; float zahl2; char zeichen, str[20]; printf("Bitte Zahl eingeben:"); scanf("%i", &zahl1); printf("Bitte Kommazahl eingeben:"); scanf("%f", &zahl2); printf("Bitte Zeichen eingeben:"); scanf("%c", &zeichen); while ((zeichen = getchar()) != EOF && zeichen != '\n'); printf("Bitte Zeichenkette eingeben:"); scanf("%s", &str[0]); while ((str[20] = getchar()) != EOF && str[20] != '\n'); printf("Die Zahl lautet: %i\n", zahl1); printf("Die Kommazahl lautet: %f\n", zahl2); printf("Das Zeichen ist: %cDer ASCII vom Zeichen ist:%d\n", zeichen,zeichen); printf("Die Zeichenkette lautet: %s\n", str); getch(); return 0; }
Zahl,Kommazahl und Zeichenkette funktionieren, aber ich bekomme das einzelne Zeichen nicht zum laufen.
ich gebe ein a ein aber es kommt dann am Ende nichts bei Zeichen und als ASCII kommt 10.
Kann mir jemand erklären wo der Fehler liegt ?
MfG
-
Tipp: 10 ist '\n'
-
Du liest das '\n' (Newline oder LineFeed) von der Entertaste ein.
Die Lösung ist ein Leerzeichen vor dem %c:scanf(" %c", &zeichen); // ^ da
Durch das Leerzeichen überliest scanf erstmal Whitespace (Leerzeiche, Tabulatoren, CR und LF)
Und statt &str[0] kannst du kurz str schreiben.
-
Vielen Dank für eure Antworten, leider funktioniert es dennoch nicht. Habe mal einen Screenshot gemacht wie es aussieht.
http://i157.photobucket.com/albums/t53/jantgolf1/Unbenannt_zps74a9e997.jpg
-
Das Problem ist deine Schleife.
Du liest dort mit getchar() Zeichen ein, die speicherst du in der Variable zeichen, bis zeichen '\n' ist. Und dann wunderst du dich wieso zeichen '\n' ist?
-
sry aber bin noch nicht so bewandert. Was genau muss ich verändern ?
-
scanf(" %c", &zeichen); hier liest du das zeichen richtig ein while ((zeichen = getchar()) != EOF && zeichen != '\n'); und hier ^ überschreibst du es wieder
Nimm eine zweite char-Variable dazu.
Z.Bchar c; ... while ((c= getchar()) != EOF && c!= '\n');
Oder lass die while-Schleifen weg.
Die dienen nur dazu, den Rest bis zum Zeilenende einzulesen.
-
Super, vielen dank. Jetzt läuft es.
Habe allerdings noch eine kleine Frage:
Undzwar wie kann ich den string ausgeben mit Leerzeichen. Bei mir gibt er jetzt immer nur bis zum ersten leerzeichen aus.
-
Das ist kein Problem mit der Ausgabe, sondern mit der Eingabe
scanf("%s", str);
liest nur Zeichen bis zum ersten Whitespace (Leerzeichen, Tabs, Newline, etc.) ein.
Um ganze Zeilen einzulesen, benutzt man am besten fgets:
fgets(str, sizeof(str), stdin);
Alternativ geht auch
scanf("%19[^\n]", str);
(aber ist etwas umständlicher, da die maximale Länge-1 fest im String eingetragen werden muß - bzw. der Formatstring selber erst zusammengesetzt werden muß)
s.a. fscanf() - Satz mit Leerzeichen auslesen
-
klasse, funktioniert. Vielen Dank.