• getchar()getch()scanf()EOF—学习总结


            大一开学已经有两个月了,我之前从没有想到大学是这么的忙,尤其是这段时间,每天5个小时的睡眠让我不堪重负。

    前段时间学习c语言时发现了些问题,总该记录一下:

    首先是getchar()函数,记得以前我基本上是用它来做停顿用的,能让exe在windows环境下运行后不直接退出,可下面的代码发现了问题:

    #include<stdio.h>
    #define N 30
    void rd(int i,int k);
    int a[N];
    void main()
    {
    	int n;
    	scanf("%d",&n);
    	a[0]=n;
    	rd(n,1);
    	getchar();
    }
    void rd(int i,int k)
    {
    	int j,p;
    	for(j=i;j>=1;j--)
    	{
    		if(j<=a[k-1])
    		{
    			a[k]=j;
    			if(j==i)
    			{
    				printf("%d=%d",a[0],a[1]);
    				for(p=2;p<=k;p++)
    					printf("+%d",a[p]);
    				printf("\n");
    			}
    	    	else
    		    	rd(i-j,k+1);
    		}
    	}
    }
    

    我运行了之后发现此exe停顿下来让我输入数据,想了想也没想出结果,于是百度了一下。原来,getchar()函数是从键盘缓冲区读取数据的,当键盘缓冲区存在数据时,不等待用户输入数据直接从缓冲区读取,知道用完为止,就好比阀门出水一样。因此,我应该加两个getchar()才能达到效果。那getch()呢?getch()与getchar()就不同了,因为getch()直接指向的是键盘这个“文件”,所以无论怎样它都会等待用户输入数据,而不会出现getchar()的情况,因此#include“conio”................getch()也能达到效果。接下来在看看scanf()这个函数,它也是从键盘缓冲区里读取数据的,因此在使用时就要注意键盘缓冲区是否有数据了。

    example:

    #include<stdio.h>
    void main()
    {
    	char a,b;
    	a=getchar();
    	scanf("%c",&b);
    }

     输出结果:

    但要注意scanf()在接受'\n'时,只有输入的是%c型时才能在缓冲区读取'\n'。当是其它的数据类型时,scanf()函数会把'\n'读取出来,但是并不会接受'\n'这个值,也就是清除一个缓冲区的数据而已。
    example:
    #include<stdio.h>
    void main()
    {
    	char a;
    	int b;
    	a=getchar();
    	scanf("%d",&b);
    }
    运行结果:
    试试按完一行后,按n个空格或回车:
     可见,getchar()和scanf()函数都可以起到清除键盘缓冲区的作用,但这样并不是很方便。c语言中有专门清除缓冲区的函数:fflush(stdin);rewind(stdin);setbuf(stdin, NULL);但要注意的是,在linux操作系统下只能用setbuf(stdio,NULL)。
     
    直到今天,我才知道c语言自带的函数也是有返回值的。例如scanf()函数,返回值是输入数据的个数,无数据输入时返回-1。所以,这也解决了我的一个问题,即scanf("%c",&a)!=EOF;c语严自带函数的返回值必要学学习一下,附下:
     
    字符函数和字符串函数:
    isalnum 是字母或数字返回1,否则返回0;
    isdigit 是,返回1;不是,返回0;
    strcat  返回str1;
    strchr  返回指向该位置的指针,如果找不到,则返回空指针;
    strcmp  str1<str2,返回负数;str1=str2,返回0;str1>str2,返回正数;
    strcpy  返回str1;
    strlen  返回字符个数;
    tolower 返回ch所代表的字符的小写字母;
    输入输出函数:
    close   关闭成功返回0;不成功,返回-1;
    eof     遇文件结束,返回1;否则返回0;
    fclose  有错返回非0;否则返回0;
    fgetc   返回所得到的字符,若读入出错,则返回EOF;
    fgets   返回地址buf,若遇文件结束或出错,返回NULL;
    fopen   成功,返回一个文件指针(文件信息区的起始地址),否则返回0;
    printf  输出字符的个数,若出错,返回负数;
    scanf   读入并给args的数据个数,遇文件结束返回EOF出错返回0;
    动态内存分配函数
    calloc  分配内存单元的起始地址,如不成功,返回0;
    free    无;
    malloc  所分配内存区地址,如内存不够,返回0;
    realloc 返回指向该内存区的指针;
     
     
                 今天很晚了,好好睡一觉吧睡觉~~      2011.10.30  3.01
     
     
     
  • 相关阅读:
    CF351A Jeff and Rounding 思维
    CF352B Jeff and Periods 模拟
    CF352A Jeff and Digits
    小B的询问 莫队分块
    小凯的疑惑 数学
    BestCoder Round #80 待填坑
    [SDOI2009]HH的项链 树状数组 BZOJ 1878
    Blocks poj 区间dp
    [USACO5.4]奶牛的电信Telecowmunication 最小割
    数位dp
  • 原文地址:https://www.cnblogs.com/zhsl/p/2743649.html
Copyright © 2020-2023  润新知