首页 > 其他分享 >cin和scanf的返回值知多少

cin和scanf的返回值知多少

时间:2024-10-30 17:42:01浏览次数:1  
标签:读取 scanf cin 知多少 成功 返回值 输入

cin的返回值

在 C++ 中,cin 是用于从标准输入(通常是键盘)读取数据的对象。

cin 的返回值实际上是一个流对象(std::istream 类型),可以通过流的状态来检查输入操作是否成功。

以下是一些关于 cin 返回值的关键点:

  1. 输入成功与失败:

    当你使用 cin 进行输入时,可以通过 cin 的状态来判断输入是否成功。例如:

    int x;
    if (cin >> x) {
        // 输入成功
    } else {
        // 输入失败
    }
    

    如果输入成功,cin 会返回一个指向 std::istream 对象的引用,这个引用可以被隐式转换为 bool,在成功时为 true,失败时为 false。

  2. 错误状态:

    如果输入格式不匹配(例如,期望一个整数但输入了字母),cin 会进入错误状态,此时:

    • cin.fail() 返回 true。

    • cin.clear() 可以用于清除错误状态,使流恢复为可用状态。

    • cin.ignore() 可以用于忽略流中的剩余字符,直到遇到换行符或指定的字符。

  3. EOF:

    当输入结束(例如,使用 Ctrl+D 在 Unix/Linux 上或 Ctrl+Z 在 Windows 上),cin 也会进入 EOF 状态,此时可以通过 cin.eof() 检查。

  4. 举一个例子

    #include <iostream>
    using namespace std;
    
    int main() {
        int num;
    
        cout << "请输入一个整数:";
        while (cin >> num) {
            cout << "你输入的整数是: " << num << endl;
            cout << "请输入一个整数(输入非整数将退出):";
        }
    
        // 处理输入错误或EOF
        if (cin.fail()) {
            cout << "输入无效,程序退出。\n";
            cin.clear(); // 清除错误状态
            cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略剩余输入
        }
    
        return 0;
    }
    

    输出如下:

    img

    img

  5. 附上《c++_primer》这本书里面的一句话(p13):

当我们使用一个istream对象作为条件时,其效果是检测流的状态。如果流有效的,即流未遇到错误,那么检测成功。当遇到文件结束符(end-of-file),或遇到一个无效输入时(例如期待读入一个整数,但读入的值不是一个整数),istream对象的状态会变为无效,处于无效状态的istream对象会使条件变为假

scanf的返回值

scanf 的返回值是一个整数,表示成功读取的输入项的数量。

具体情况如下:

  1. 成功读取:
  • 如果 scanf 成功读取到所需数量的输入项(如 %d %d 需要读取两个整数),它返回成功读取的项数。

    例如:如果成功读取两个整数,返回值为 2。

  • 如果只成功读取一个整数(例如,第二个输入不符合格式),返回值为 1。

  1. 输入结束:

    如果在读取过程中遇到文件结束符(EOF),scanf 将返回 EOF(通常是 -1),表示没有更多的数据可供读取。

  2. 输入错误:

    如果输入的格式与预期不匹配,scanf 会返回成功读取的项数(可能为 0),并且不会将任何值存储到变量中。例如,如果期待一个整数但输入的是字母,返回值将是 0。

给出一个C程序来验证:

#include <stdio.h>

int main()
{
	int x = 0, y = 0;
	for (int i = 1; i <= 4; i ++ )
	{
		int res = scanf("%d %d", &x, &y);
		printf("scanf的返回值:%d\n", res);
		// 清空缓冲区,避免上次输入的不合法的内容仍然在缓冲区中,影响下次读入 
		int c;
    	while ((c = getchar()) != '\n' && c != EOF); // 读取直到换行或文件结束
		
	}
	
	return 0;
} 

输出如下:

img

标签:读取,scanf,cin,知多少,成功,返回值,输入
From: https://www.cnblogs.com/hisun9/p/18516300

相关文章

  • ThingsBoard规则链节点:GPS Geofencing Events节点详解
    引言1.GPSGeofencingEvents节点简介2.节点配置3.使用场景3.1物流跟踪3.2资产管理3.3安全监控3.4农业监测4.实际项目中的应用4.1项目背景4.2项目需求4.3实现步骤5.总结引言GPSGeofencingEvents是ThingsBoard规则链中的一个重要节点,用于处理......
  • Allegro 设置Spacing间距规则汇总
    废话不多说,直接上图说明:因为allegro约束规则还是比较细致,特别是间距规则设置比较多,所以一定要搞明白。1.差分对的对内线距PrimaryGap 不要理解为对内线中心到中心的距离,就是边缘线的距离2. 线Line与线的间距3.线Line到通孔管脚ThruPin的间距4. 线Line到......
  • 如何使用Event Sourcing
    有效使用EventSourcing的步骤是:1.定义域事件;2.实现事件存储;3.重放事件,恢复状态;4.构建并使用投影;5.保证系统的一致性。在引导EventSourcing过程中,确定清晰的边界上下文及其所涉及的事件非常关键,并确保事件的存储与查询能够在系统的整个生命周期内保持一致和可靠。1.定义域事件......
  • Cinemachine系列——CinemachineSmoothPath&Body Tracked Dolly
    今天来看下我感觉比较有意思的功能,将摄像机像电影一样固定在一条轨道上进行拍摄。通过PackageManager导入Cinemachine插件,在导入CinemachineSample后,我们可以在Assets文件夹下Cinemachine/2.6.17(这个是你下载的cinemachine版本号)/CinemachineExampleScenes/Scenes/TrackedDo......
  • Cinemachine系列——最佳视野(一)&CinemachineClearShot
    这里介绍一下,自动切换到场景中最佳视野的摄像机的第一种方式。首先介绍一下CinemachineClearShot组件,它是自动完成这项工作的核心。通过PackageManager导入Cinemachine插件,在导入CinemachineSample后,我们可以在Assets文件夹下Cinemachine/2.6.17(这个是你下载的cinemachine版本......
  • Cinemachine——磁力吸实现&CinemachineTargetGroup
    视角“聚焦”是游戏过场动画中常见的功能,Cinemachine实现这个功能,让我们看看具体怎么使用吧。通过PackageManager导入Cinemachine插件,在导入CinemachineSample后,我们可以在Assets文件夹下Cinemachine/2.6.17(这个是你下载的cinemachine版本号)/CinemachineExampleScenes/Scenes......
  • [COCI2009-2010#4] PALACINKE 题解
    前言题目链接:洛谷。题意简述\(n\)个点,\(m\)条边。每条边上有商店,经过一条边花费\(1\)单位时间,如果在边上的商店购物,额外花费\(1\)单位时间。需要购买\(4\)种物品,每个商店售出\(1\sim4\)种物品不等。请问,在\(T\)个单位时间内,从\(1\)出发购物,得到这\(4\)种物品......
  • Cinemachine系列——CinemachineConfiner
    使用CinemachineConfiner扩展可以限制相机的位置在特定的体积或区域内。Confiner可以在2D或3D模式下工作,不同的模式影响它接受的边界形状。在3D模式下,相机在三维空间中的位置被限制在一个体积内,这同样适用于2D游戏,但需要考虑深度。在2D模式下,深度问题不需要考虑。对于正交相机......
  • Cinemachine系列——任意门
    今天来看一下官方Demo的任意门具体实现方式吧,通过PackageManager导入Cinemachine插件,在导入CinemachineSample后,我们可以在Assets文件夹下Cinemachine/2.6.17(这个是你下载的cinemachine版本号)/CinemachineExampleScenes/Scenes/AnywhereDoor中看具体的Demo。具体原理是通过......
  • Cinemachine系列——Noise&Basic Multi Channel Perlin
    在Cinemachine相机的游戏对象中使用基本多通道柏林噪声组件,以通过柏林噪声运动模拟相机抖动。柏林噪声是一种计算伪随机运动并具有自然行为的技术。简单来说,基本多通道柏林噪声组件应用了一个噪声配置资产,用于定义噪声随时间变化的行为。Cinemachine自带了一些噪声配置资产,你可以......