之前讲的putchar(),getchar()都是字符的输入输出,字符串的输入输出除了基本的scanf(),printf(),也有puts(),gets(),fgets(),fputs()等。
如果想要把一个字符串读取到程序当中,得先为它预留一个存储空间,再用输入函数获取字符串。
预留存储空间的话要么提前定义好大小的数组,要么用分配内存空间的函数
1.gets()函数
gets代表get string,它对于交互式程序比较友好,它从系统的标准输入设备(通常是键盘)获得一个字符串,但是字符串没有预定的长度,它得知道什么时候读取结束,这时候换行符就是停止标志,而回车键就能提供换行符,它会读取换行符之前的所有字符,并添加一个空字符(\0)交给程序。
#include <stdio.h>
#define MAX 81
int main(void )
{
char name[MAX];
char * ptr;
printf("Hi,what's your name?\n");
ptr = gets(name);
printf("%s? Ah! %s is a good name\n",name,ptr);
return 0;
}
输出结果如下
Hi,what's your name?
God
God? Ah! God is a good name
gets()它使用一个地址将字符串赋予给了name,并返回了一个指向字符串的指针值,但是如果出错或遇到文件结尾则返回空地址。
2.fgets()
gets()一个不足就是不检查预留空间是否能够容纳实际输入的数据,多出的字符就溢出到相邻的内存区了。fgets()则解决这个问题,但是fgets()是为读取文件而设计,在标准键盘输入上就不如gets()那么方便。
#include <stdio.h>
#define MAX 81
int main(void )
{
char name[MAX];
char * ptr;
printf("Hi,what's your name?\n");
ptr = fgets(name,MAX,stdin);
printf("%s? Ah! %s is a good name\n",name,ptr);
return 0;
}
运行结果如下:
Hi,what's your name?
God
God
? Ah! God
is a good name
可以看出fgets()与gets()三个方面的不同
1.它需要第二个参数来说明最大读入字符数。如果这个参数值为n, fgets ()就会读取最多n~1个
字符或者读完一一个换行符为止,由这二者中最先满足的那个来结束输入。
2.它还需要第三个参数来说明读哪一个文件。从键盘上读数据时,可以使用stdin(代表standard imput)作为该参数,这个标识符在stdio.h中定义。
3.如果fgets ()读取到换行符,就会把它存到字符串里,而不是像gets ()那样丢弃它。如结果所示,每次显示字符串的时候都会捎带一个换行符。
3.puts()
puts()函数的使用很简单,只需要给出字符串参数的地址,与printf()不同,puts()显示字符串时自动加换行符,它的问题是必须检测到表示结束的空字符
4.fputs()
fputs ()函数是gets ()的面向文件版本。两者之间的主要区别是:
fputs ()需要第二个参数来说明要写的文件。
可以使用stdout (代表standard output)作为参数来
进行输出显示,stdout 在stdio.h中定义。
与puts ()不同,fputs ()并不为输出自动添加换行符。
之所以这样是因为puts() gets()搭配使用,fputs() fgets()搭配使用。