c语言获取终端输入字符串的函数scanf,gets,fgets

获取终端输入字符串scanf,gets,fgets

获取终端中输入字符串,我们常用getchar(),scanf(),gets(),和fgets()函数实现,这里简单汇总一下:

​ scanf() 函数可以获取到终端字符串,但是不能识别到空格字符,遇到空格会终止,空格后面的字符串会在缓冲区中,下次获取时会继续用。

​ gets()函数以回车字符进行标识,获取用户输入字符串以回车为终止符。

​ scanf和gets函数都是不安全的,如果目标字符串缓冲区无法存储我们输入的字符串,会导致段错误

​ fgets()函数限定了获取字符串的长度,如果输入字符串过多,依然可以只获取限定长度的字符串,剩下的字符串还在输入缓冲区中。

测试demo以及输入测试描述:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//scanf输入遇到空格会当成结束符
//gets是遇到回车结束 fgets其实对gets的一些完善扩展
int main()
{
//scanf 读取终端内容时  遇到空格会终止
// 终止后剩余的结果其实还在终端缓冲区中,会在后面读取缓冲区继续生效
	char data[20];
	printf("please test of scanf :\n");
	scanf("%s", data);
	printf("scanf func get data is [%s] \n", data);
	memset(data, 0, 20);
	printf("please test of space scanf :\n");
	scanf("%s", data);
	printf("scanf func get data is [%s] \n", data);
	memset(data, 0, 20);
	fflush(stdin);	//可以刷新缓冲区 一般用在读数据后没读完

//gets可以读取换行前的所有字符,但是gets是不安全的,如无法保证长度越界
	printf("please test of gets \n");
	gets(data);
	printf("gets func get data is [%s] \n", data);
	memset(data, 0, 20);
	printf("please test of space gets :\n");
	gets(data);
	printf("gets func get data is [%s] \n", data);
	memset(data, 0, 20);
//使用fgets函数  对gets函数的扩展,限定了读取数据的长度
	printf("plese test of fgets : \n");
	fgets(data,  20, stdin); //字符串地址  字符串长度   读入的文件   
	printf("fgets func get data is : [%s]", data);

	memset(data, 0, 20);
	printf("please test of len out of 20 fgets:\n");
	fgets(data,  20, stdin);
	printf("fgets func get data is : [%s] \n", data);
	memset(data, 0, 20);
	fflush(stdin);
	return 0;
}


/********************************************
输出的结果:
hlp@ubuntu:~/com_port$ ./in
please test of scanf :   ==>scanf正常输入
12334
scanf func get data is [12334]  ==》打印获取终端的输入
please test of space scanf :	==》scanf输入带空格的字符串
123 1231 
scanf func get data is [123]    ==》发现只打印了空格前的字符串
please test of gets 
gets func get data is [ 1231 ] 	==》没有经过手动输入, get函数直接获取到终端缓冲区中已经存在的字符串
please test of space gets :		==》get函数测试带空格的字符串
123 123 412
gets func get data is [123 123 412]  ==》get函数能打印带空格的字符串,终结符以回车为准
plese test of fgets : 			==》测试fget函数获取,在长度内,发现获取到终端内的回车字符
123123 123 1
fgets func get data is : [123123 123 1
]please test of len out of 20 fgets:	==》如果超过fgets函数参数限制的长度,获取到输入的固定长度字符19个字符
12312 1231231 12312 123123 12312123
fgets func get data is : [12312 1231231 12312]
**************************************************/


/********************************************
可以看出,输入字符串过长,scanf和get函数如果获取长度过多,都会引发段错误
hlp@ubuntu:~/com_port$ ./in
please test of scanf :
1
scanf func get data is [1] 
please test of space scanf :
1
scanf func get data is [1] 
please test of gets 
gets func get data is [] 
please test of space gets :
111111111111111111111111111111111111111111
gets func get data is [111111111111111111111111111111111111111111] 
plese test of fgets : 
12
fgets func get data is : [12
]please test of len out of 20 fgets:
12
fgets func get data is : [12
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)

hlp@ubuntu:~/com_port$ ./in
please test of scanf :
111111111111111111111111111111111111111
scanf func get data is [111111111111111111111111111111111111111] 
please test of space scanf :
11111111111111111111111111111111111
scanf func get data is [11111111111111111111111111111111111] 
please test of gets 
gets func get data is [] 
please test of space gets :
1
gets func get data is [1] 
plese test of fgets : 
1
fgets func get data is : [1
]please test of len out of 20 fgets:
1
fgets func get data is : [1
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)

**************************************************/

/********************************************
可以看出,输入字符串过长,如果用fget函数进行获取,会在限制长度内获取,下次继续获取缓冲区中剩余字段
hlp@ubuntu:~/com_port$ ./in
please test of scanf :
1
scanf func get data is [1] 
please test of space scanf :
1
scanf func get data is [1] 
please test of gets 
gets func get data is [] 
please test of space gets :
1
gets func get data is [1] 
plese test of fgets : 
1111111111111111111111111111111111111111111111111111111111111111111111111
fgets func get data is : [1111111111111111111]
please test of len out of 20 fgets:
fgets func get data is : [1111111111111111111]
**************************************************/
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
scanfgets都是C语言中常用的输入函数,但它们在使用上有一些区别。 scanf是格式化输入函数,可以按指定的格式从标准输入流(通常是键盘)读取数据。它的使用方式是通过格式字符串来指定输入的数据类型和格式,并且可以使用多个格式字符串来读取多个输入。例如,可以使用"%d"来读取一个整数,"%f"来读取一个浮点数,"%s"来读取一个字符串等。scanf函数会跳过输入中的空格、制表符和换行符,直到读取到有效的输入为止。然而,scanf函数存在一些安全性问题,因为它无法控制输入的长度,可能导致缓冲区溢出。 gets是一种不安全的输入函数,它可以从标准输入流读取一行字符串,并将其存储在指定的字符数组中。gets函数会读取输入中的所有字符,包括空格、制表符和换行符,直到遇到换行符为止。然而,gets函数没有办法检查输入数据的长度,可能导致缓冲区溢出。因此,在实际使用中,不推荐使用gets函数。 为了更安全地读取字符串,推荐使用fgets函数fgets函数可以指定读取的最大字符数,避免了缓冲区溢出的问题。使用fgets函数时,需要注意将换行符也纳入考虑,因为它会被读取到并存储在字符串中。 综上所述,scanfgets的主要区别在于输入方式和安全性。scanf是格式化输入函数gets是一次性读取一行字符串函数,而fgets是更安全的读取字符串函数。在实际使用中,应尽量避免使用不安全的输入函数gets

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值