C语言fgets()与fputs()详解

fgets()与fputs()

  • fgets()函数的第二个参数指明了读入字符的最大数量。如果该参数为n,那么fgets函数将读入n-1个字符。如果fgets()函数读到一个换行符,会把它储存在字符串中。这点与gets不同,gets会丢弃换行符。fgets()函数的第三个参数指明要读入的文件。如果读入从键盘输入的数据,则以stdin作为参数。
  • fputs()函数的第二个参数指明他要写入的文件。如果要在计算机显示器上打印,则使用stdout作为参数。与puts()函数不同,fputs()函数不会在待输出字符串末尾添加一个换行符。

例:

#include <stdio.h>
#define LEN 14
int main(void){
    
    char words[LEN];
   
    puts("Enter a String");
    fgets(words,LEN, stdin);
    puts(words);  //puts()函数会添加换行符\n
    fputs(words, stdout);
    
    return 0;
    
}

在这里插入图片描述
输入apple后,apple\n\0 被存储在数组中。
我们看到控制台输出的内容发现输出的两个apple之间有一行空白,因为puts()函数会添加换行符\n。

1⃣️fgets()优缺点:

fgets()储存换行符有好有坏

  1. 缺点是你可能并不想把换行符储存在字符串中,这样的换行符会带来一些麻烦。
  2. 优点是对于储存的字符串而言,检查末尾是否有换行符可以判读是否读取了一整行。如果不是一整行,要处理好一行中剩下的字符。

2⃣️fgets()返回值:

读取成功,返回读取到的字符串,即string;失败或读到文件结尾返回NULL。

下面的程序验证读到文件结尾返回NULL。读入并显示用户输入的内容,直到fgets()读到文件结尾或空行(即,首字符为换行符)。

3⃣️fgets()操作实例:

#include <stdio.h>
#define LEN 10
int main(void){
    
    char words[LEN];
   
    puts("Enter Strings (empty line to quit): ");
    while(fgets(words, LEN, stdin) != NULL && words[0] != '\n'){
        fputs(words, stdout);
    }
    
    puts("Done!");
    
    return 0;
    
}

在这里插入图片描述
LEN设置的为10,所以fgets()一次读取9个字符(剩余一个字符留给’\0’),第一次读取到" I’m Kevin ",并存储为I’m Kevin\0,接着fputs()打印出来,并且没有换行。然后while进入下一轮迭代,fgets()继续读取,第二次读取到“ ,from Chi ",并存储为,from Chi\0,接着fputs()打印出来,并且没有换行。直到读取完所有字符为止。最后一次输入时,直接键入回车,所以跳出while循环,程序结束并打印Done!

3⃣️fgets()操作进阶:

如果说我们想第一次的输入 “I’m Kevin,from China.” 只读取前9个字符,然后丢弃掉其他的字符,第二次输入也是如此,那该怎么办???
换句话说该想法就是:按照设定的大小读取输入行,并删除储存在字符串中的换行符,如果没有换行符,则丢弃数组装不下的字符。
再拆分成小的问题则就是以下的两个问题:

  1. 那如果不希望把换行符储存在字符串中,如何处理掉换行符呢??
    我们可以在已储存的字符串中查找换行符,并将其替换为空字符:
while(words[i] != 'n' ) {
	i++;
	}
words[i] = '\0\;
  1. 如果仍然有字符串留在输入行怎么办??
    丢弃掉其余的字符串即可。
    详细原理可以查看主页文章《C语言 getchar()原理及易错点解析》
while(getchar() != '\n')
	continue;

我们把这两个问题整合到上面的代码中:

#include <stdio.h>
#define LEN 10
int main(void){
    
    char words[LEN];
   
    puts("Enter Strings (empty line to quit): ");
    while(fgets(words, LEN, stdin) != NULL && words[0] != '\n'){
       
        int 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;
    
}

在这里插入图片描述

   while(words[i] != '\n' && words[i] != '\0'){
                i++;
            }

这段代码说的是,遍历字符串,直至遇到换行符或者空字符。如果先遇到换行符,下面的if语句将其换成空字符;如何先遇到空字符,else就将输入行舍弃。

注意⚠️:空字符与空格不一样!!!!空字符是’ \0 ',ASCII码为0;空格的ASCII为32. 下面程序可以验证:

#include <stdio.h>
void main()
{
    char a=' ';
    char b='\0';
    printf ("%d\n",a);
    printf ("%d\n",b);
    
}

Output:

32
0
  • 62
    点赞
  • 297
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值