首先是我的实验结果: getchar会把缓冲区中的换行符、空格符、制表符都读走,且可以得到在shell中,按下回车键,std_input中输入的是一个换行符'\n'。
printf("I am here!\n");
char a=0;
a=getchar();
printf("First input!\n");
printf("%c\n",a);
a=getchar();
printf("Second input!\n");
printf("%cI am here!\n",a);
我们输入:1回车,运行结果如下:
I am here!
1
First input!
1
Second input!
I am here!
结论:shell在按下回车键时输入停止,getchar从标准缓冲区中读入字符,并且回车键被读入标准输入缓冲区。
注:制表符和空格也可以读入,这里不做实验。
最后一行代码改为:
printf("%dI am here!\n",a);
我们输入:1回车,运行结果如下:
I am here!
1
First input!
1
Second input!
10I am here!
说明getchar得到的是换行符:‘\n’。
因为程序从输入设备得到的数据都会先存到shell的标准输入缓冲区中,所以可以知道按下回车键shell的标准缓冲输入区得到的是换行符:‘\n’。
这个与从文件中输入数据不同,这里不做讨论。
printf("I am here!\n");
char a=0;
a=getchar();
printf("First input!\n");
printf("%c\n",a);
scanf("%c",&a);
printf("Second input!\n");
printf("%dI am here!\n",a);
scanf从也是从缓冲区中读入的,实验结果相同:
I am here!
1
First input!
1
Second input!
10I am here!
但是非缓冲输入呢?我们看下面的代码:
#include <stdio.h>
#include <conio.h>
int main(){
printf("I am here!\n");
char a=0;
a=getch();
printf("First input!\n");
printf("%c\n",a);
a=getch();
printf("Second input!\n");
printf("%dI am here!\n",a);
return 0;
}
我们输入:1回车,运行结果如下:
结论:非缓冲输入下,回车键得到的是:'\r'。
那么文件输入呢?
我们打开一个文本文件,其中包含两段文字:
这里我们可以先讨论一下在文件中换行到底是什么样子的。
首先我们新建一个文本文档,默认是ANSI编码的,也就是一个中文字符2字节,一个英文字符1字节,随便输入一些内容。注意第二行我没有输入回车键。
可以看到按下一一次回车键增加两个字节,所以我们不难得出:window 系统行末结束符是\r\n。
那么问题是fgetc读取换行处时读到的是什么?
我们做下面的一个程序来演示这个过程:
FILE*fp=NULL;
char ch=0;
fp=fopen("F:\input.txt","r+");
while(ch!=EOF){
ch=fgetc(fp);
putchar(ch);
printf("%d",ch);
}
那个"10"对应的是‘\n’,最后的-1是宏EOF,所以fgetc读到的是换行符‘\n’。
其实水平制表符‘\t’也会被读到,这里不做演示。
当然我们也要考虑一下字符串的输入与输出,下一次我会在做实验。