【字符串】fputs函数详解
fputs() 函数也是⽤来显⽰字符串的,它的原型是:
1 #include <stdio.h>
2int fputs(const char*s,FILE *stream);
s代表要输出的字符串的⾸地址,可以是字符数组名或字符指针变量名。
stream 表⽰向何种流中输出,可以是标准输出流 stdout,也可以是⽂件流。标准输出流即屏幕输出,printf 其实也是向标准输出流中输出的。
fputs() 和 puts() 有两个⼩区别:
1. puts() 只能向标准输出流输出,⽽ fputs() 可以向任何流输出。
2. 使⽤ puts() 时,系统会在⾃动在其后添加换⾏符;⽽使⽤ fputs() 时,系统不会⾃动添加换⾏符。
那么这是不是意味着使⽤ fputs() 时就要在后⾯添加⼀句“printf("\n");”换⾏呢?看情况!如果输⼊时使⽤的是 gets(),那么就要添加 printf 换⾏;但如果输⼊时⽤的是 fgets(),则不需要。
因为使⽤ gets() 时,gets() 会将回车读取出来并丢弃,所以换⾏符不会像 scanf 那样被保留在缓冲区,也不会被 gets() 存储;⽽使⽤ fgets()时,换⾏符会被 fgets() 读出来并存储在字符数组的最后,这样当这个字符数组被输出时换⾏符就会被输出并⾃动换⾏。
但是也有例外,⽐如使⽤fgets()时指定了读取的长度,如只读取 5 个字符,事实上它只能存储 4 个字符,因为最后还要留⼀个空间给
'\0',⽽你却从键盘输⼊了多于 4 个字符,那么此时“敲”回车后换⾏符就不会被 fgets() 存储。数据都没有地⽅存放,哪有地⽅存放换⾏符呢!此时因为 fgets() 没有存储换⾏符,所以就不会换⾏了。
下⾯写⼀个程序验证⼀下:
1 #include <stdio.h>
2int main(void)
3 {
4char str[20];//定义⼀个最⼤长度为19,末尾是'\0'的字符数组来存储字符串
5    printf("请输⼊⼀个字符串:");
6    fgets(str,19,stdin);//从输⼊流stdin中读取18个字符到字符数组str中
7    fputs(str,stdout);//将字符数组的内容输出到输出流stdout中
8return0;
9 }
我们看到读取 18个字符⾜够存储“我很想你你在哪⾥”,上述共8*2+1=17个字符,所以 fgets() 最后会存储换⾏符。这样 fputs() 输出时这个换⾏符就能换⾏了。⼀个汉字两个字符。
下⾯再将读取的字符改⼩⼀点看看:
1 #include <stdio.h>
2int main(void)
3 {
4char str[20];//定义⼀个最⼤长度为19,末尾是'\0'的字符数组来存储字符串
5    printf("请输⼊⼀个字符串:");
6    fgets(str,5,stdin);//从输⼊流stdin中读取4个字符到字符数组str中
字符串复制函数
7    fputs(str,stdout);//将字符数组的内容输出到输出流stdout中
8return0;
9 }
我们看到并没有换⾏。
值得说明的是,虽然 gets()、fgets()、puts()、fputs() 都是字符串处理函数,但它们都包含在 stdio.h 头⽂件中,并不是包含在 string.h 头⽂件中。