C语言学习笔记---字符读取函数scanf()、gets()、fgets()

x33g5p2x  于2021-10-29 转载在 其他  
字(2.3k)|赞(0)|评价(0)|浏览(500)

在从控制台读取字符的时候,常用的函数有scanf()、 gets()、fgets()这几个函数,那么这几个函数有什么区别和联系呢?

1、scanf()函数

sacnf() 函数用来从键盘读取字符串,下面通过一个简单的例子来看一下它的用法。

#define LEN 20
int main()
{
	char str[LEN];
	
	printf("enter a string:\r\n");
	scanf("%s",str);
	printf("string is:\r\n");
	printf("%s",str);

	system("pause");
	return 0;
}

提示输入一个字符串,然后将输入的字符串打印出来。测试结果如下:

  输入的字符串是“abc def”,但是打印出来的字符串是"abc"。由此可见scanf()函数更像一个单词读取函数,当遇到空白字符时,就会自动结束。
这就要求输入的字符串中间不能有空格。

一般scanf()函数和printf()函数一起使用。

2、gets()函数

gets() 函数也是用来从键盘读取字符串,下面通过一个简单的例子来看一下它的用法。

#define LEN 20
int main()
{
	char str[LEN];
	puts("enter a string:");
	gets(str);
	puts("string is:");
	puts(str);

	system("pause");
	return 0;
}

测试结果如下:

  输出的字符串和输入的字符串一样,说明gets函数读取字符串的时候中间可以有空格。在输入字符串的时候,按回车键之后,才会打印出输入的字符,说明gets()函数是通过换行符来结束字符串的读取的。

通过观察代码和输出的字符串可以发现,在代码中没有输出换行符,但是打印的字符串自动换行了,说明使用puts()函数输出的时候,自动在字符串的末尾加上的换行符。

一般gets()函数和puts()函数一起使用。

3、fgets()函数

fgets() 函数也是用来从键盘读取字符串,但是它在读取字符串的时候,还需要设置参数。下面通过一个简单的例子来看一下它的用法。

#define LEN 20
int main()
{
	char str[LEN];
	fputs("enter a string:",stdout);
	fgets(str,LEN,stdin);
	fputs("string is:",stdout);
	fputs(str,stdout);
	
	system("pause");
	return 0;
}

输出结果如下:

  输出的字符串和输入的字符串一样,说明fgets函数读取字符串的时候中间可以有空格。在输入字符串的时候,按回车键之后,才会打印出输入的字符,说明fgets()函数是通过换行符来结束字符串的读取的。
  在代码中没有加入回车换行符,打印出的字符串也没有换行,说明fputs()函数不会自动在字符串后面加入回车换行符。

在读取字符串的时候,fgets()函数里面有三个参数,第一个是要存储的字符串位置,第二是要读取字符串的最大长度。第三个是从哪个设备输入。 stdin 表示标准的输入设备,也就是键盘。stdout表示标准的输出设备,也就是显示器。

通过第三个参数可以看出,fgets函数不仅可以从键盘读取数据,也可以从其他地方读取数据,那么将代码改为从文件中读取数据试试。

#define LEN 20
int main()
{
	char str[LEN];
	FILE *in;
	in = fopen("abc.txt","r");
	fputs("read a string:\r\n",stdout);
	fgets(str,LEN,in);
	fputs("string is:\r\n",stdout);
	fputs(str,stdout);
	
	system("pause");
	return 0;
}

首先打开一个文本文档,然后使用fgets()函数从打开的文档中读取数据,最后将数据打印出来。

  对比输出结果和文本中内容可以看出,从文件中读取字符串也是成功的。 同样也可以从键盘中读取数据,然后写入到文本中去。修改代码如下:

in = fopen("abc.txt","a+");
	fputs("read a string:\r\n",stdout);
	fgets(str,LEN,stdin);
	fputs("string is:\r\n",stdout);
	fputs(str,in);

这里通过追加的方式打开记事本,然后读取键盘上的内容,通过fputs函数,写入到记事本中去。

  对比输入的字符串和记事本中的内容,可以看出在控制台输入的字符串已经被成功追加到了记事本中。由此可见fgets()和fputs()是一个通用的输入输出函数。不仅仅在控制台可以使用,在其他输入输出设备上也可以使用。

总结

通过上面的例子可以总结出这三个字符输入函数的特点:

  • scanf()函数比较适合于用来读取单词,遇到空白字符时就自动结束。
  • gets()函数比较适合读取字符串,它是遇到回车换行符才会结束。
  • fgets()函数是一个通用的输入函数,它可以从控制台以外的设备上读取字符串,功能更加强大,但是在使用的时候传入的参数比较多。

相关文章