cin和scanf的返回值知多少

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

posted @ 2024-10-30 17:54  hisun9  阅读(23)  评论(0编辑  收藏  举报