gets,fgets,getchar,puthar,stdin,stdout总结

一、gets()函数:

 char *gets(char *s);
 从键盘中读入字符串到s中,但是有个缺点,就是不会考虑到溢出问题。

  
  
  • 1
  • 2

例子:

#include <stdio.h>
 int main(int argc,char **argv)
 {
     char str[5];
     gets(str);

     printf("%s",str);
     return 0;
}


  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11


使用gets函数,编译的时候会报警告,就是关于溢出问题它不能很好的处理。比如,我们这str是5个字节,但是当我们输入超过5个字节的时候,它依旧会将多余的字节读入str中。

二、fgets()函数:

   fgets很好的解决了gets的弊端,可以说fgets是gets的进化版。

  
  
  • 1

函数名: fgets
功 能: 从流中读取一字符串
用 法: char *fgets(char *string, int n, FILE *stream);
形参注释:*string输入数据的首地址;n-1:一次读入数据块的长度,其默认值为1k,即1024;stream文件指针。(读取n-1个字符,因为还需要读取最后的\n)。
相比gets()函数,此函数还有一个很好的用处就是从标准输入流中读取字符串,而且不用担心输入的字符个数超出了字符数组的大小而导致溢出的问题!

实例:

 int main(int argc,char **argv)
 {
     char str[5];
     fgets(str,5,stdin);//从标准输入流中读入

     printf("%s",str);

     return 0;
 }
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出结果:
这里写图片描述

三、标准输入stdin

stdin是标准输入,一般指键盘输入到缓冲区里的东西。

用简单的两个程序来理解它:

实例1

#include<stdio.h>
intmain()
{
int a=0;
int b=0;
int c=0;
int ret=0;
ret=scanf("%d%d%d",&a,&b,&c);
printf("第一次读入数量:%d\n",ret);
ret=scanf("%d%d%d",&a,&b,&c);
printf("第二次读入数量:%d\n",ret);
return0;
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行结果:

正确输入三个整数的结果:
这里写图片描述
我们可以看到每次读入的数量都是3,如果我们把第二次输入中间的2改为字符a,那么输入的不是整数,与scanf中不匹配,stdin流就会被阻塞,直接返回。结果如下:
这里写图片描述

实例2

为了增强对stdin阻塞的了解,把上述代码稍作修改(把第二次输入的第一个值改为字符型%c)

#include<stdio.h>
intmain()
{
inta=0;
intb=0;
intc=0;
intret=0;
ret=scanf("%d%d%d",&a,&b,&c);
printf("第一次读入数量:%d\n",ret);
ret=scanf("%c%d%d",&a,&b,&c);
printf("第二次读入数量:%d\n",ret);
return0;
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行结果:
这里写图片描述
我们第一次输入时,当输入到a时stdin被阻塞,scanf直接返回1。第二次输入时,a相当于被阻塞在stdin中,在等待匹配%c,第二次输入刚好有个%c打头,所以相当于第二次输入了 a 3 4 三个数
即便再多输入,也只能读取到三个:
这里写图片描述


四、标注输出stdout

stdout是一个文件指针,C己经在头文件中定义好的了,可以直接使用,把它赋给另一个文件指针。

看一个简单的例子:

#include <stdio.h>
void func(FILE *p)
{
    char *str="i love you!";
    fputs(str,p);  //将字符串输入到P中
}
int main()
{
    func(stdout); 
    printf("\n");
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行结果:
这里写图片描述

五、getchar()

1.从缓冲区读走一个字符,相当于清除缓冲区,一般用在gets ,fgets等函数前面用于清除回车符。

2.前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误

3.getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab)
getchar()使用不方便,解决方法:
(1)使用下面的语句清除回车:
while(getchar()!=’\n’);
(2)用getche()或getch()代替getchar(),其作用是从键盘读入一个字符(不用按回车),注意要包含头文件conio.h

4.getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。
实际上是 输入设备->内存缓冲区->程序getchar

你按的键是放进缓冲区了,然后供程序getchar 你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存缓冲区.

键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到’\n’.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar**每次只能读取一个字符**.如果需要取消’\n’的影响,可以用getchar();来清除,这里getchar();只是取得了’\n’但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符.还要注意的是这里你在键盘上输入ssss看到的回显正是来自于getchar的作用,如果用getch就看不到你输入了什么.

这里写图片描述

因为gets,fgets等函数会自动从缓冲区中读取字符,所以需要先将残留的/n去掉,一般情况,都会在缓冲区留下“/n”,所以调用gets,fgets之前先调用getchar是一个好习惯。

经常的我们会在程序总看到这样的判断语句:

while((x=getchar())!=’\n’)
用于从键盘中读取一个值,这个值不等于\n(回车)。

看这样一个例子:

4 #include <stdio.h>
 int main(void)
 {
     int c;
     char x;
     printf("输入第一个数:");
     scanf("%d",&c);

   //getchar();

     while((x=getchar())!='\n') //第二个输入字母
    {   
        printf("第二个字母为:");
        printf("%c\n",x);
    }

    printf("第一个数的值为:%d\n",c);

     return 0;

 }

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

运行结果:
这里写图片描述
我们可以看到,将putchar注释掉以后,缓冲区留有“\n”,所以while循环直接读取“\n”,所以不执行循环体内的内容。

接下来,我们把putchar加入得到如下运行结果:
这里写图片描述

值得一提的是,getchar如果读入一个整数,用printf输出整数时输出的是整数的ASCII码而不是整数本身。

六、putchar()

该函数将制定的表达式的值所对应的字符输出到标准输出终端(stdout)上。表达式可以是字符型或整型,它每次只能输出一个字符

putchar函数的基本格式为:putchar(c)。

(1)当c为一个被单引号(英文状态下)引起来的字符时,输出该字符(注:该字符也可为转义字符);

(2)当c为一个介于0~127(包括0及127)之间的十进制整型数时,它会被视为对应字符的ASCII代码,输出该ASCII代码对应的字符;

(3)当c为一个事先用char定义好的字符型变量时,输出该变量所指向的字符。

一、gets()函数:

猜你喜欢

转载自blog.csdn.net/qq_26565435/article/details/82753182