有没有专门做素食的美食网站,汽车配件外贸网站,移动端网站如何做导出功能吗,郑州网站推广多少钱#x1f680; 作者#xff1a;阿辉不一般 #x1f680; 你说呢#xff1a;不服输的你#xff0c;他们拿什么赢 #x1f680; 专栏#xff1a;爱上C语言 #x1f680;作图工具#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话#xff0c;还请点赞… 作者阿辉不一般 你说呢不服输的你他们拿什么赢 专栏爱上C语言 作图工具draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话还请点赞关注收藏支持博主如有不足还请指点博主及时改正感谢大家支持 文章目录 前言输入缓冲区scanf()函数gets()函数getchar()函数✈️清空输入缓冲区 前言
大家好啊今天阿辉将为大家介绍C语言中scanf、gets以及getchar关于字符串的输入关注阿辉不迷路哦 内容干货满满接下来就跟着阿辉一起学习吧
输入缓冲区
输入缓冲区是计算机系统中用于存储输入数据的一种缓冲区 怎么理解他呢比如我们C语言中的scanf以及今天阿辉要介绍的函数他们并非直接读取我们在键盘上敲的数据而是我们敲的数据先存在缓冲区内然后scanf从缓冲区里面读取的 注意 上面的图只是简单的描述输入缓冲区就像你的饭卡你往里面充钱一次可能充100块但是scanf这顿饭可能就只读12块 阿辉今天要讲的就是scanf、gets、getchar以及fgets在缓冲区中是如何读取的 输入缓冲区的数据一旦被读取就不再输入缓冲区了
scanf()函数
scanf()相信大家都不陌生他就是通过占位符从标准输入流中格式化的读取数据然后把数据存储在参数所指向的位置 1.标准输入流默认是键盘输入 2.参数就是地址例如a这样 我们来看一个栗子
#includestdio.hint main()
{int a 0;int b 0;scanf(%d%d, a, b);printf(a %d b %d\n, a, b);scanf(%d%d, a, b);printf(a %d b %d\n, a, b);return 0;
}注意只要scanf不是使用%c读取数据时数据前面的空白字符(空格、制表符以及换行)都会被忽略 好吧以上都不是重点重点是对于字符串的读取 上星期一道牛客OJ题给阿辉整的汗流浃背(点击可跳转) 题目
输入描述:
输入一个字符串可以有空格输出描述:
输出逆序的字符串示例1
输入
I am a student
输出
tneduts a ma I关于这道题的代码
#include stdio.h
#include string.hvoid reverse(char *p, int sz) {int i 0;int j sz - 1;for (i 0, j sz - 1; i sz / 2; i, j--) {char tmp *(p i);*(p i) *(p j);*(p j) tmp;}
}int main()
{char arr[10000] {0};int i 0;scanf(%[^\n]%*c,arr);int sz strlen(arr);reverse(arr, sz);printf(%s, arr);return 0;
}孤陋寡闻的阿辉只会用scanf用%s读而%s遇到空格换行制表符就会停止读取用%c读换行\n都给我读来了我靠真的汗流浃背了阿辉急忙翻题解我丢这题解真是让人两眼放光gets还有scanf的高级用法 scanf读字符串的神仙用法:
scanf可以通过字符集的方式读取字符scanf(%[a-z],str)a-z指的是只读取a到z之间的小写字母遇到非范围内的字符停止读取当然你也可以用[A-Z]只读大写字母范围自定义scanf(%[ ^\n ],str)^\n指的是只读取非\n的字符包括制表符和空格遇到换行停止读取当然你也可以^\t都是是自定义的scanf(%*c,str)*指的是对于一个字符类型的数据只读取但不存储给任何变量就是把这个数据从输入缓冲区去掉这一个操作也可以%*d也是自定义的 栗子
int main()
{char str1[10] { 0 };char str2[10] { 0 };scanf(%[a-z], str1);scanf(%[^\n], str2);printf(%s\n, str1);printf(%s, str2);return 0;
}输入
abcd1换行
输出
abcd --第一行
1 --第二行因为第一个scanf只读取a-z之间的数据读到1停止读取而1后面还有一个换行1和换行都还在输入缓冲区内因为第二个scanf读到换行就会停止读取因为输入缓冲区有换行了你连键盘输入的机会都没有了这里\n还留在输入缓冲区 这里我们对输入缓冲区的理解应该更加清晰了scanf从缓冲区读取数据输入缓冲区有适合的数据就不需要你输入了就像你饭卡有钱就不用充钱了 如果我们这么写
int main()
{char str1[10] { 0 };char str2[10] { 0 };scanf(%[a-z]%*d%*c, str1);scanf(%[^\n]%*c, str2);printf(%s\n, str1);printf(%s, str2);return 0;
}输入
abcd1换行
ab123换行
输出
abcd --第一行
ab123 --第二行这里第一个scanf里面的%*d%*c将1和换行\n给读取了但并未赋给任何变量我的理解就是把输入缓冲区一个有符号数和一个字符给删掉然后到第二个scanf的时候输入缓冲区就没数据了得我们自己输入 gets()函数
gets这个函数并不会检查输入的长度可能导致缓冲区溢出并不建议大家使用可能出bug不过gets这个函数还是很猛的。 用法
char *gets(char *str);
str指向字符数组的指针
返回值读取成功为str读取错误为EOFgets(str)只能读取字符包括空格和制表符直到遇到换行符或者文件结束符停止读取然后将\n从输入缓冲区删除相当于scanf(%[ ^\n ]%*c,str)
getchar()函数
getchar()从键盘获取一个字符返回值也是这个字符无参数直到用户按下回车键或输入的字符达到了缓冲区的最大长度停止读取一次只读取一个字符包括空格、换行和制表符相当于scanf(%c,c)
✈️清空输入缓冲区
利用getchar()我们可以写一个清空输入缓冲区的函数
void clearbuffer(void)
{while (getchar() ! \n){;}
}int main()
{char str1[10];char str2[10];scanf(%s, str1);clearbuffer();scanf(%s, str2);printf(str1 %s\n, str1);printf(str2 %s\n, str2);return 0;
}输入输出 1234\n都被clearbuffer这个函数读取了从输入缓冲区清除了 这里while判断的条件是getchar ! ‘\n’getchar读取到哪个字符它的返回值就是哪个字符所以这里我们这样来清空缓冲区是连带\n一起清理掉的当getchar()吸收了’\n’则getchar() ‘\n’ 不满足条件就退出while循环了 到这里阿辉今天对于C语言中的scanf、gets以及getchar分享就结束了希望这篇博客能让大家有所收获, 如果觉得阿辉写得不错的话记得给个赞呗你们的支持是我创作的最大动力