C语言fgets()与fputs()详解
C语言fgets()与fputs()详解
- fgets()与fputs()
- 1⃣️fgets()优缺点:
- 2⃣️fgets()返回值:
- ⃣️fgets()操作实例:
- ⃣️fgets()操作进阶:
fgets()与fputs()
- fgets()函数的第二个参数指明了读入字符的最大数量。如果该参数为n,那么fgets函数将读入n-1个字符。如果fgets()函数读到一个换行符,会把它储存在字符串中。这点与gets不同,gets会丢弃换行符。fgets()函数的第三个参数指明要读入的文件。如果读入从键盘输入的数据,则以stdin作为参数。
- fputs()函数的第二个参数指明他要写入的文件。如果要在计算机显示器上打印,则使用stdout作为参数。与puts()函数不同,fputs()函数不会在待输出字符串末尾添加一个换行符。
例:
#include <stdio.h>
#define LE 14
int main(void){char words[LE];puts(Enter a String);fgets(words,LE, stdin);puts(words); //puts()函数会添加换行符\nfputs(words, stdout);return 0;}
输入apple后,apple\n\0 被存储在数组中。
我们看到控制台输出的内容发现输出的两个apple之间有一行空白,因为puts()函数会添加换行符\n。
fgets()储存换行符有好有坏
- 缺点是你可能并不想把换行符储存在字符串中,这样的换行符会带来一些麻烦。
- 优点是对于储存的字符串而言,检查末尾是否有换行符可以判读是否读取了一整行。如果不是一整行,要处理好一行中剩下的字符。
读取成功,返回读取到的字符串,即string;失败或读到文件结尾返回ULL。
下面的程序验证读到文件结尾返回ULL。读入并显示用户输入的内容,直到fgets()读到文件结尾或空行(即,首字符为换行符)。
#include <stdio.h>
#define LE 10
int main(void){char words[LE];puts(Enter Strings (empty line to quit): );while(fgets(words, LE, stdin) != ULL && words[0] != \n ){fputs(words, stdout);}puts(Done!);return 0;}
LE设置的为10,所以fgets()一次读取9个字符(剩余一个字符留给’\0’),第一次读取到 I’m Kevin ,并存储为I’m Kevin\0,接着fputs()打印出来,并且没有换行。然后while进入下一轮迭代,fgets()继续读取,第二次读取到“ ,from Chi ,并存储为,from Chi\0,接着fputs()打印出来,并且没有换行。直到读取完所有字符为止。最后一次输入时,直接键入回车,所以跳出while循环,程序结束并打印Done!
如果说我们想第一次的输入 “I’m Kevin,from China.” 只读取前9个字符,然后丢弃掉其他的字符,第二次输入也是如此,那该怎么办???
换句话说该想法就是:按照设定的大小读取输入行,并删除储存在字符串中的换行符,如果没有换行符,则丢弃数组装不下的字符。
再拆分成小的问题则就是以下的两个问题:
- 那如果不希望把换行符储存在字符串中,如何处理掉换行符呢??
我们可以在已储存的字符串中查换行符,并将其替换为空字符:
while(words[i] != n ) {i;}
words[i] = \0\;
- 如果仍然有字符串留在输入行怎么办??
丢弃掉其余的字符串即可。
详细原理可以查看主页文章《C语言 getchar()原理及易错点解析》
while(getchar() != \n )continue;
我们把这两个问题整合到上面的代码中:
#include <stdio.h>
#define LE 10
int main(void){char words[LE];puts(Enter Strings (empty line to quit): );while(fgets(words, LE, stdin) != ULL && 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为2. 下面程序可以验证:
#include <stdio.h>
void main()
{char a= ;char b= \0 ;printf (%d\n,a);printf (%d\n,b);}
Output:
2
0
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 9 条评论) |
本站网友 什么是大v | 24分钟前 发表 |
如果不是一整行,要处理好一行中剩下的字符 | |
本站网友 伯克纳 | 5分钟前 发表 |
LE | |
本站网友 神经衰弱的治疗方法 | 4分钟前 发表 |
如果fgets()函数读到一个换行符,会把它储存在字符串中 | |
本站网友 脚本错误 | 12分钟前 发表 |
例: #include <stdio.h> #define LE 14 int main(void){char words[LE];puts(Enter a String);fgets(words | |
本站网友 第一产业增加值 | 9分钟前 发表 |
优点是对于储存的字符串而言,检查末尾是否有换行符可以判读是否读取了一整行 | |
本站网友 大港油田二手房 | 26分钟前 发表 |
LE | |
本站网友 深入浅出mfc | 0秒前 发表 |
然后while进入下一轮迭代,fgets()继续读取,第二次读取到“ | |
本站网友 美容培训学院 | 2分钟前 发表 |
优点是对于储存的字符串而言,检查末尾是否有换行符可以判读是否读取了一整行 |