![cover](https://lsky.genson.fun/blog/2024/01/15/65a4a018a977c.webp)
scanf遇到空格结束的问题
解决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
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是转载文章,版权归原作者所有。建议访问原文,转载本文请联系原作者。
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果