IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> ?( ‘ω‘ )? 【超详细!!!C语言scanf问题】scanf吃掉回车或空格问题 -> 正文阅读

[C++知识库]?( ‘ω‘ )? 【超详细!!!C语言scanf问题】scanf吃掉回车或空格问题

一、什么是scanf语句?

它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>

读取方式:

一般格式为:scanf(格式控制,地址列表),也就是scanf("%?",&?);

可以读取对应类型的数值并且存储到指定的变量,并且可以读取多个数值,如数字,字符,字符串等?,每次用到scanf时,都会从数据缓存区读取一个或多个字符,并存入相对应的变量中。

【注意】

  • scanf()在读取数值时会跳过空格、制表符以及换行符。
  • %c只能输出或输入一个字符,%s输出的是一串字符。
  • scanf中空格的作用:

    空格( )即为读取一个结束字符然后丢掉,而普通的字符不受影响。

二、scanf()常见吃掉回车或空格问题

我们经常在练习的时候会发现scanf把回车或者空格“吃掉了”,这导致我们的运行结果和预期的不同,大家看下面这个例子(例1):

#include <stdio.h>

int main()
{
	char arr[100];
	scanf("%s", arr);
	printf("%s\n", arr);
	return 0;
}

在这里我们输入abcdef,结果如下:

但当输入的数值当中有空格时:

?从这里我们可以看到,遇到空格scanf就停止输入了,因为scanf已经读取了字符串"abc",之后遇到空格,就会结束一次输入,空格不会被接收,遇到空格就认为对arr的赋值结束了,后面的def被忽略,这里我们要注意的是:def会留存在键盘缓存区。

接下来看另外一个例子(例2):

#include <stdio.h>

int main()
{
	char c1, c2;
	scanf("%c %c", &c1, &c2);
	printf("%d %d\n", c1, c2);

	scanf("%c%c", &c1, &c2);
	printf("%d %d\n", c1, c2);
	return 0;
}

结果如下:

?我们会发现:第一次输入没有问题,但是第二次输入就有问题了。

为什么呢?

因为:scanf单字符输入时规定只接收一个字符。在第一次输入的时候,scanf("%c %c");之间有一个空格,我们输入a的值之后,输入空格(此时空格被看做字符对待,空格会读取停止字符并释放掉),再输入b的值,第一次输入正常,这时scanf把第一次输入时的回车符也当做字符取对待了,当我们输入完b之后按回车,这个回车是放在缓冲区的;第二次调用scanf("%c%c",&c1,&c2);时,把还在缓冲区的回车当做字符赋值给c1,之后把a赋值给c2。所以第二次输入有问题了。

三、解决方法

1、当scanf()函数在接收字符串时,遇到空格就会停止接收,我们可以使用gets()函数代替,或者使用一个参数,%[ ]

%[ ]:这个参数的意义是读入一个字符集合。[ ]是个集合的标志,因此%[ ]特指读入此集合所限定的那些字符。比如%[A-Z]是输入大写字母,一旦遇到不在此集合的字符便停止。如果集合的第一个字符是“^”,这说明读取不在“^“后面集合的字符,即遇到”^“后面集合的字符便停止,此时读入的字符串是可以含有空格的。(\n 表示换行符)

则上面例1的正确代码为:

#include <stdio.h>

int main()
{
	char arr[100];
	scanf("%[^\n]", arr);
	printf("%s\n", arr);
	return 0;
}

结果为:

2、当scanf()函数在接受多个单个字符时,只需要在输入的对应位置加好空格即可(把缓冲区里的内容赋值给相对位置)。

则上面例2的正确代码为:

#include <stdio.h>

int main()
{
	char c1, c2;
	scanf("%c %c", &c1, &c2);
	printf("%d %d\n", c1, c2);

	scanf(" %c %c", &c1, &c2);
	printf("%d %d\n", c1, c2);
	return 0;
}

结果为:

?【如有错误欢迎评论指正!】

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 08:51:02  更:2021-08-28 08:51:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 5:37:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计