文章目录
- fgets()与fputs()
- 1⃣️fgets()优缺点:
- 2⃣️fgets()返回值:
- 3⃣️fgets()操作实例:
- 3⃣️fgets()操作进阶:
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()储存换行符有好有坏
- 缺点是你可能并不想把换行符储存在字符串中,这样的换行符会带来一些麻烦。
- 优点是对于储存的字符串而言,检查末尾是否有换行符可以判读是否读取了一整行。如果不是一整行,要处理好一行中剩下的字符。
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个字符,然后丢弃掉其他的字符,第二次输入也是如此,那该怎么办???
换句话说该想法就是:按照设定的大小读取输入行,并删除储存在字符串中的换行符,如果没有换行符,则丢弃数组装不下的字符。
再拆分成小的问题则就是以下的两个问题:
- 那如果不希望把换行符储存在字符串中,如何处理掉换行符呢??
我们可以在已储存的字符串中查找换行符,并将其替换为空字符:
while(words[i] != 'n' ) {
i++;
}
words[i] = '\0\;
- 如果仍然有字符串留在输入行怎么办??
丢弃掉其余的字符串即可。
详细原理可以查看主页文章《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