getchar是如何工作的:

首先是我的实验结果: 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’也会被读到,这里不做演示。

当然我们也要考虑一下字符串的输入与输出,下一次我会在做实验。

猜你喜欢

转载自blog.csdn.net/qq_42820594/article/details/82391480