解决scanf获取输入数据时,遇到空格结束的问题

先简单了解一下scanf函数:

函数原型:int scanf(const char *format, ...);

参数:要注意的是变量前面的取地址符&不要忘记
返回值 :返回的是正确按指定格式输入变量的个数,也就是能正确接收到值的变量个数

#include <stdio.h>

int main(int argc, const char **argv)
{
	int a=0,b=0,i=0;
	
	i = scanf("%d %d",&a,&b);
	printf("i = %d\n",i);
	
	return 0;
}

以上代码
如果输入:4 5,则输出结果为:i = 2
如果输入:4 k,则输出结果为:i = 1
因为a和b都是整型数据,输入的k为字符,故正确接收到的变量就只有a,所有才输出 i = 1

回归正题,请看以下代码

#include <stdio.h>

int main(int argc, const char **argv)
{
	char buf[20]={0};
	
	printf("输入一串字符:");
	scanf("%s",buf);
	
	printf("buf = %s\n",buf);	
}

如果输入字符串为:abcd ,返回的结果无疑是:buf = abcd
那如果输入字符串:a b c d 呢,返回的结果则为:buf = a

这是因为:
scanf的读取原理是匹配字符,当scanf从缓冲区读取数据时遇到空格和回车键则会认为读取完毕

因此有以下几种方式解决
(1)使用gets(buf); 替换scanf("%s",buf);即可,但是编译时系统会报警告,说它不安全,因为gets()不能指定获取数据的长度,故可使用fgets()

(2)使用fgets(buf,20,stdin); 替换scanf("%s",buf);即可

函数原型:char *fgets(char *s, int size, FILE *stream);
参数说明:
	char *s	:存储读到的数据的首地址,这里是buf
	int size:存储空间的大小,这里是20
	FILE *stream:读的目标文件的文件流,这里是stdin
返回值:
	成功返回一个指针,指向字符串中第一个字符的地址
	失败/读到末尾,返回NULL

(3)使用scanf("%[^\n]",buf); 替换scanf("%s",buf);即可
这是从一些大牛们的博客找到的方法,一开始并不理解为什么这样就可以,后来找到在这篇博客有说到https://blog.csdn.net/qq_30007603/article/details/81164232

总结为:[^\n]的意思是scanf遇到\n才停止读取,需注意的是,使用
scanf("%[^\n]",buf)后,buf中存放的字符串末尾是没有‘\n’的。

要想知道更多关于scanf的用法和注意事项可以看看:
http://c.biancheng.net/view/160.html

https://www.cnblogs.com/windpiaoxue/p/9184194.html