C语言之scanf和gets在字符串输入时遇到空格?

本文介绍了如何在C语言中处理scanf遇到空格的问题,通过gets函数和格式化输入%[]解决。还讨论了scanf获取单个字符的局限性,提出使用getchar()或scanf的变通方法。关键点在于正确处理字符和字符串输入,以及scanf的使用场景和注意事项。
摘要由CSDN通过智能技术生成

生活中,字符和字符串无处不见。当你输入带空格的一段字符串时,比如:“I love you”。如果你用scanf输入,语句应该是这样的:

char str[100];
scanf("%s",str);

而你得到的结果却是

I

由此,我们可以断定,scanf遇到空格就停止读入了。
那么我们应该如何解决这个问题呢?
我们有两种解决方法。
第一种:用gets函数

char str[100];
gets(str);

得到的结果如下:

I love you

因为gets可以读入空格,遇到回车才会停止,gets对末尾回车符的处理是接收回车并把回车替换为\0;而scanf遇到空格、回车和Tab键都会认为输入结束,所以它是不能接收空格的。
第二种方法:要用到一个格式字符:%[] -->一个字符集。

char str[100];
scanf("%[^\n]",str);直到输入回车键,读取才结束,当然不能超过a定义的大小,否则会出错。此命令与gets(str)效果一样。

得到的结果如下:

I love you

C语言中scanf()函数提供的“%[]”格式串可以用来进行多个字符的输入,并对结束符进行自定义。对于%[]还可以用^+任意字符(包括 EOF)来结束字符串的输入,如%[^EOF]就是直到有EOF 输入,字符串才中止。
举个例子:

char str[100];
scanf("%[^EOF]",str);

你可以输入很多个字符串,直到输入EOF结束。虽然格式不一样,但最后得到的结果都是一样的。
如果要你输入a和b两个字符,用下面的语句能得到吗?

#include<stdio.h>
int main()
{
	char a,b;
	scanf("%c",&a);
	scanf("%c",&b);
	printf("%c,%c",a,b);
	return 0;
}

很明显,这里是得不到a和b的,得到的结果如下所示:

a, 

这是为什么呢?
原因主要就是在输入空格(回车or tab键)的时候,scanf遇到空格(回车or tab键)就认为输入结束。所以我们这里可以采用getchar();把空格(回车or tab键)吃掉,这样scanf输入的时候,只会碰到最后的回车才结束。

#include<stdio.h>
int main()
{
	char a,b;
	scanf("%c",&a);
	getchar();
	scanf("%c",&b);
	printf("%c,%c",a,b);
	return 0;
}

我们也可以采用下面的方法进行操作:

char str[100];
scanf("%[^\n]%*c",str);///遇到回车符就认为输入结束
printf("%s",str);

总结
这些知识点虽然非常小,但是却非常实用。比如,你做一个学生成绩管理系统,当你输入学生性别的时候,或许就会考虑到字符或者字符串的输入问题。细节决定成败!抓住了每一个小细节,你离成功又进了一步!加油吧,骚年!

scanfgets都是C语言中常用的输入函数,但它们在使用上有一些区别。 scanf是格式化输入函数,可以按指定的格式从标准输入流(通常是键盘)读取数据。它的使用方式是通过格式字符串来指定输入的数据类型和格式,并且可以使用多个格式字符串来读取多个输入。例如,可以使用"%d"来读取一个整数,"%f"来读取一个浮点数,"%s"来读取一个字符串等。scanf函数会跳过输入中的空格、制表符和换行符,直到读取到有效的输入为止。然而,scanf函数存在一些安全性问题,因为它无法控制输入的长度,可能导致缓冲区溢出。 gets是一种不安全的输入函数,它可以从标准输入流读取一行字符串,并将其存储在指定的字符数组中。gets函数会读取输入中的所有字符,包括空格、制表符和换行符,直到遇到换行符为止。然而,gets函数没有办法检查输入数据的长度,可能导致缓冲区溢出。因此,在实际使用中,不推荐使用gets函数。 为了更安全地读取字符串,推荐使用fgets函数。fgets函数可以指定读取的最大字符数,避免了缓冲区溢出的问题。使用fgets函数,需要注意将换行符也纳入考虑,因为它会被读取到并存储在字符串中。 综上所述,scanfgets的主要区别在于输入方式和安全性。scanf是格式化输入函数,gets是一次性读取一行字符串的函数,而fgets是更安全的读取字符串函数。在实际使用中,应尽量避免使用不安全的输入函数gets
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值