getchar () - Funktion in c
Ich habe gerade angefangen zu lernen-I/O Datei-Operationen in c von Programmierung in c von stephen Kochan. In einer der übung Fragen wie die, die unten
Schreiben Sie ein Programm, das zeigt den Inhalt einer Datei auf dem terminal 20 Zeilen zu einem Zeitpunkt. Am Ende jeder 20 Zeilen, die das Programm warten, bis ein Zeichen eingegeben, das terminal. Wenn das Zeichen für den Buchstaben q, das Programm soll stoppen Sie die Anzeige der Datei, alle anderen Zeichen sollte dazu führen, dass die nächsten 20 Zeilen der Datei angezeigt werden.
#include<stdio.h>
int main(void)
{
int count=0,c;
FILE *fname;
char name[64];
char again='a';
printf("enter the name of file to be read : ");
scanf("%s",name);
if((fname=fopen(name,"r"))==NULL){
printf("file %s cannot be opened for reading \n",name);
return 1;
}
while(again!='q'){
count=0;
while((c=getc(fname))!=EOF)
{
if(c!='\n')
{
putchar(c);
}
else{
putchar('\n');
count++;
printf("count = %i\n",count); //debug statement
}
if(count>19)
break;
}
again=getchar();
printf("again = %c\n",again); //debug statement
}
fclose(fname);
printf("\n");
return 0;
}
In das obige Programm, wenn ich schaute auf die Ausgabe zunächst war das Programm die Anzeige von 40 zahlen, ohne Pause auf 20 zahlen, also ich habe einige debugging-Anweisungen in der oben, um zu sehen, wohin ich gehe falsch und der Ausgang war ich immer war:
count = 1
2
count = 2
3
count = 3
4
count = 4
5
count = 5
6
count = 6
7
count = 7
8
count = 8
9
count = 9
10
count = 10
11
count = 11
12
count = 12
13
count = 13
14
count = 14
15
count = 15
16
count = 16
17
count = 17
18
count = 18
19
count = 19
20
count = 20
again = //it skipped the loop the first time
21
count = 1
22
count = 2
23
count = 3
24
count = 4
25
count = 5
26
count = 6
27
count = 7
28
count = 8
29
count = 9
30
count = 10
31
count = 11
32
count = 12
33
count = 13
34
count = 14
35
count = 15
36
count = 16
37
count = 17
38
count = 18
39
count = 19
40
count = 20
q
again = **need to input here**
Also für die erste Zeit, die getchar()
ist nicht Aufforderung für eine Eingabe. So ersetzte ich den Teil, wo getchar()
ist mit:
scanf(" %c",&again);
Es funktioniert, wie erwartet, in Ordnung. Das Programm wird eine Aufforderung für eine Eingabe für die erste Zeit nach dem 20 neue Linien. Ich habe auch Links ein paar Leerzeichen, so dass scanf
würde es ignorieren. So langen post kurz zu machen, ich glaube nicht, dass ich verstanden hatte, das Verhalten von getchar()
komplett. Ich versuche zu lernen, diese Dinge habe ich selbst Gegoogelt, um eine Erklärung, aber ich kam leer. Jede Hilfe und feedback zu diesem würde sehr geschätzt.
getchar
gibt einen int, nicht char, denn es muss return EOF, so ändern Sie bitteagain
zuint
- aber es gab Programme, in denen
getchar()
wird verwendet, um das nächste Zeichen aus dem user? - ich habe es geändert, aber es ist immer noch das gleiche Verhalten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sobald Sie diesen Punkt in Ihrem Programm, und geben Sie den Namen der Datei und drücken Sie die EINGABETASTE, ein Zeilenvorschub-Zeichen (
\n
) wird Hinzugefügt, um die input-Streams, die gar nicht Lesenscanf
, sondern abgeholt wird, durch den ersten Aufruf vongetchar()
statt.Weiteres problem bei der Verwendung von
scanf
zu Lesen in einer mit dem Namen ist, dass es ist umständlich in der Handhabung Dateinamen mit Leerzeichen. Erwägen Sie die Verwendungfgets()
statt, die sowohl Lesen Sie die Zeilenvorschub-Zeichen und Griff Dateinamen mit Leerzeichen. Der Nachteil bei der Verwendungfgets()
ist, dass Sie haben, um Streifen der\n
Charakter selbst.Einen kürzeren, aber vielleicht nicht so klar Weg, um Streifen die Zeilenvorschub-Zeichen:
Das problem, das Sie erleben, ist eine, die beißt, die meisten neuen C-Programmierer, die die Verwendung
scanf
und berücksichtigen nicht Alle Zeichen in der input buffer (z.B.stdin
). Wenn Sie anrufenscanf
mit%s
als format-specifier, geben Sie input und dann drücken Sie die Taste Enter, alles bis auf die ersten Leerzeichen Zeichen gelesen wird, in die Sie den Zeiger angegebene variable in der argument-Liste -- verlassen'\n'
(die Leerzeichen) ungelesen imstdin
. Das nächste mal, wenn Sie versuchen zu Lesenstdin
die trailing'\n'
von Ihrem vorherigen Aufrufscanf
ist das erste, was gelesen wird. Wenn, was auch immer Sie Lesen ausstdin
mit nicht Griff die'\n'
- haben Sie ein problem.Richtig zu handhaben, das Problem, entweder Konto für den Zeilenumbruch in Ihrem format-string bei jedem Aufruf
scanf
oder Schleife überstdin
mitgetchar()
bis ein'\n'
(oderEOF
) aufgetreten ist. Mithilfe der format-string, den Sie verwenden könnten:ist, oder Leerzeichen in der Zeichenfolge
Wo
%[^\n]
liest alle Zeichen bis zu, aber nicht eingeschlossen den Zeilenumbruch (so dass Leerzeichen im string) und%*c
liest und verwirft die'\n'
ohne das match-count (die'*'
die Zuordnung-Unterdrückung Betreiber) sollten Sie auch hinzufügen%63[^\n]
zur Begrenzung der Anzahl von Zeichen Lesen um zu verhindern, dass schreiben über array-Grenzen.Aber wenn der Zweck der übung ist es, machen Sie sich mit der Charakter-orientierte-Eingang Funktionen (
getchar
,fgetc
, etc..), warum verwenden Sie etwas anderes, als zu beginnen? Sie könnten nur etwas wie:Setzen den Rest zusammen und schnitzte nach unten die Logik ein bisschen, Sie könnten etwas tun wie:
Beispiel Verwendung/Ausgabe
Schauen Sie vorbei und lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben.
Korrigierten code. Ich habe nicht entfernt die debugging-Anweisungen.
Was ich getan habe ist, eine
getchar()
nachscanf()
. Klar, dasENTER
Links vonscanf()
im Puffer.