C语言-gets函数

gets函数

gets函数原型:char *gets(char *str)
  1. 功能:从stdio流中读取字符串直到遇到换行符或者EOF时停止,并将读取的结果存放在str指针所指字符数组中换行符不作为读取内容 ,读取的换行符被转换为NULL值 并由此结束字符
    即:gets函数用来从标准输入设备读取字符串直到遇到回车,但是回车不属于字符串
    系统自动用’\0’代替换行符作为字符串的结束标志 ==> 所以判断是否到字符串结尾要用’\0’
  2. gets函数可以无限读取不会判断上限,所以需要编者自己保证接收的指针所指向的空间足够大
//输入一行字符分别统计其中英文字母,空格,数字和其他字符的个数 
#include
#include
#include
main()
{
	
	int count1,count2,count3,count4,i;
	char *ch;
	count1=count2=count3=count4=0;
	ch=(char*)malloc(sizeof(char));
	printf("input a string:");
	//scanf("%s",str) ;
	gets(ch); 
	printf("%s\n",ch); 
	for(i=0;ch[i]!='\0';i++)
	{
		if((ch[i]>='a'&&ch[i]<='z')||(ch[i]>='A'&&ch[i]<='Z'))
			count1++;//英文字母个数 
		else if(ch[i]>='0'-0&&ch[i]<='9'-0)
			count2++;//数字个数 
		else if(ch[i]==' ')
			count3++;//空格个数 
		else count4++;//其他字符个数 
	}
	printf("英文字母个数:%d\n数字个数:%d\n空格个数:%d\n其他字符个数:%d\n",count1,count2,count3,count4);

}

注意:在使用字符串指针之前要先给字符串指针分配空间。

char *str="\0";str就是一个字符串指针可以直接指向一个字符串 
str=(char*)malloc(NUM*sizeof(char));//给字符指针分配空间,NUM:分配几个指定大小的空间
printf("input a string:");
gets(str); 
printf("%s\n",str); 
gets函数与scanf函数比较
  1. 相同点:
  • 都是从标准输入设备中接收。
  • 接收的字符串结束之后都会自动在字符串的末尾追加’\0’作为字符串结束符。
  1. 不同点:
  • gets函数:只把换行符作为结束分隔符,即gets函数可以接收空格(’ ‘)和制表符(’\t’).
    scanf函数遇到空格,制表符,换行符都会自动结束接收

  • 两者对缓冲区中的回车符不同:
    gets函数一遇到回车就结束,并把这个回车从缓冲区中移走
    scanf函数在读非空白字符之前会忽略回车,在读取之后如果遇到空白字符会停止输入,并将其留在缓冲区里

      如:输入\ndddd\n
      char *sh;
      sh=(char*)malloc(sizeof(char));
      //scanf("%s",sh);
      gets(sh);
      printf(sh);
    

    scanf函数会忽略第一个换行符,读取后面的字符串,当之后遇到换行符才结束输入
    gets函数会在遇到第一个换行符时就结束输入
    但是scanf输入结束时第二个换行符被留在缓冲区中
    gets输入结束之后换行符也被读走了

    • gets可以读取回车但是scanf不能
      可以用下面代码简要验证:
    #include
    #include
    main()
    {
    	char *str1,str2;
    	str1=(char*)malloc(sizeof(char));
    //	scanf("%s",str1);
    	gets(str1);
    	printf("%s\n",str1);
    	str2=getchar();
    	printf("%d\n",str2);
    }
    

当用gets函数接收字符串时结果如下
C语言-gets函数_第1张图片
【分析】:gets时输入hh字符串按Enter键得到如上图结果,由代码可知字符变量str2是用来接收缓冲区中字符的,但是显然此时str2并没有接收到任何数据,也就是gets函数接收结束后Enter之后的回车换行被移走并没有存在缓冲区中。因为getchar还没有接收数据上图显示程序并没结束。
当scanf函数接收字符串时结果如下图
C语言-gets函数_第2张图片
【分析】:输入hh之后按下Enter,由上图可知,enter的换行符并没有被移走而是放在了缓冲区中(回车:字符13,被作为结束标志使用’\0’代替了)一次后面的getchar()就会直接读取缓冲区中的字符10最后由printf函数输出。

你可能感兴趣的:(gets函数与scanf函数,c语言)