C语言的输入输出函数大总结

C提供了各种各样的输入输出函数,每一个都各有特色,不可替代,但是要想完美驾驭,就要熟悉每一个IO函数的特点。

  • 不幸的gets()函数

    gets函数读取整行输入,直至遇到换行符,然后丢弃换行符。

    缺点:只有一个参数,无法检查数组是否装的下行,如果输入的字符串过长,会导致缓冲区溢出,及多余的字符超出了指定的目标空间。如果这些多余的字符只是占用了尚未使用的空间,那么无伤大雅。但是如果擦除到程序中其他的数据,程序就会中断。

    C99保留了gets()函数,但是建议人们不要使用,C11从标椎中废除了gets()函数。

  • gets()的替代品

    C11标椎新增的gets_s()函数也可以替代gets().他可以替换现有代码中的gets().但是,他是stdio.h输入/输出函数系列中的可选扩展,所以支持C11的编译器也不一定支持他。

  • fgets()函数

    fgets()函数通过第2个参数限制读入的的字符数来解决溢出的问题。该函数专门设计用于处理文件输入。

    1. fgets()函数的第二个参数指明了读入字符的最大数量,如果参数是n,那么将读入n-1个字符,或者读到遇到的第一个换行符为止。
    2. 如果fgets()函数读到一个换行符,会把他存储在字符串里。gets()函数会直接丢弃。
    3. fgets()函数的第三个参数指明读入的文件。如果将从键盘读入,则以stdin作为参数,该标识符定义在stdio.h中
    4. fgets函数指向返回charl类型的指针。如果一切顺利,该函数返回的地址与传入的第一个参数相同。但是如果读到文件结尾,他会返回一个空指针,通常用数字0或NULL来代替。
    5. 系统使用缓冲的I/O,这意味着用户按下return 键之前,输入都被存储在缓冲区。当按下return键,将整行输入发送给fgets()函数,对于输出,fgets函数将字符发送给另一个缓冲区,当发送换行符时,缓冲区的内容被显示在屏幕上。
    //如何处理掉换行符
    while(word[i]!='\n')
        i++;
    word[i]='\0';
    
    //如何处理留在输入行的字符
    while(getchar()!='\n')
        continue;
    

    遍历字符串,直至遇到换行符或空字符,如果遇到换行符,则丢弃换行符。如果遇到空字符,则丢弃剩下的语句

    #define STLEN 10
    int main()
    {
    	char words[STLEN];
        int i;
        puts("please input:");
        while(fgets(words,STLEN,stdin)!=NULL && words[0]!='\n')
        {
            i=0;
            while(words[i]!='\n' && words[i]!= '\0')
                i++;
            if(words[i]=='\n')
                words[i]='\0';
            else
    			while(getchar()!='\n')
       			 continue;
            puts(words);
    	}
        puts(done);
        return 0;
    }
    
  • 空字符和空指针

    空字符是用于标记C字符串末尾的字符,其对应的字符编码为0.

    空指针有一个值,该值不会与任何有效的地址对应。同常遇到文件结尾或者未按预期执行会返回NULL.

    区别:空字符是整数类型,空指针是指针类型,他们虽然都可以用数值0来表示。但是俩者是概念不同的0,空字符是一个字符,占一个字节。空指针是一个地址,占8个字节。

  • gets_s()函数

    第二个参数会限制读入的字符数,这样就比较安全。

    1. gets_s()只从标准输入中读取数据,所以不需要第三个参数
    2. gets_s()读取到换行符会丢弃他而不是保存他
    3. 如果gets_s()函数读到最大字符数都没有读到换行符,会依赖实现的“处理函数”。
  • s_gets()函数

    fgets()函数的一种用法,读取整行输入并用空字符代替换行符,或者读取一部分,丢弃另一部分

    char * s_gets(char * st,int n)
    {
    	char * ret_val;
        int i = 0;
        ret_val=fgets(st,n,stdin);
        if(ret_val)//ret_val!=NULL
        {
    		while(st[i]!='\n' && st[i]!='\0'){
    			i++;
            }
            if(st[i]=='\n'){
                st[i]=='\0';
            }
            else{
                while(getchar()!='\n')
                    continue;
            }
    	}
        return ret_val;
    }
    

    如果fgets函数返回NULL,说明读到了文件结尾或出现了读取错误,s_gets()函数跳过了这个过程。

  • scanf()函数

    scanf()函数更像是获取单词的函数,而不是获取字符串的函数。

    返回值:scanf()返回一个整数值,该值等于scanf()函数成功读取的项数或EOF(读到文件结尾时返回EOF)

    字段宽度:可使用字段宽度,限制读取的字符数。如:scanf(“%10s”,name),读取数组前10个字符。

    缺点:scanf()函数和gets()函数一样,如果输入的内容过长,scanf()也会导致数据溢出。不过可以使用字段宽度来进行限制。

    输入函数大杂烩

    1. gets()函数
      • 优点:简单,好用,只有一个参数,自动丢弃换行符
      • 缺点:不能检测输入长度,容易数据溢出
    2. gets_s()函数
      • 优点:简单,兼容gets()函数,不会数据溢出,自动丢弃换行符
      • 缺点:他是标椎IO可选扩展,大多数编译器不支持
    3. fgets()函数
      • 优点:最强输入函数,安全,可操控性强(可丢弃换行符,可剩余字符)
      • 缺点:相对来说不好用(三个参数),自动保存换行符。------可使用s_gets()函数来解决
    4. scanf()函数
      • 优点:简单,好用。自动丢弃换行符。
      • 缺点:太明显,他只能读取一个单词,遇到空格或者换行节就结束。还容易数据溢出。(可以使用字段宽度限制)
  • puts()函数

    puts()函数很容易使用,只需要把字符串的地址作为参数传递给他即可。

    puts()函数会自动在其末尾添加一个换行符

    如何停止呢?该函数遇到空字符就会停止输出,所以必须确保有空字符。通常内存中有很多空字符,幸运的话puts()函数很快就会发现一个。但是这样很不靠谱。

  • fputs()函数

    fputs()函数是puts()函数针对文件定制的版本。

    1. fputs()函数的第2个参数指明要写入数据的文件。如果要打印在显示器上,可以用stdout作为参数。
    2. 与puts()函数不同,fgets()函数不会再输出的末尾添加换行符。
  • printf()函数

    和gets()函数一样,printf()也把字符串的地址作为参数。

    与puts()函数不同,printf()函数不会在输出末尾添加换行符。

    printf()优点在于他可以同时打印多个字符串。如:printf(“%s %s %s”,name.address,hope)

  • 自定义输入输出函数

    getchar()函数

    putchar()函数

示例:

char a;
a=getchar();
putchar(a);
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值