cin和scanf的返回值知多少
cin的返回值
在 C++ 中,cin
是用于从标准输入(通常是键盘)读取数据的对象。
cin
的返回值实际上是一个流对象(std::istream
类型),可以通过流的状态来检查输入操作是否成功。
以下是一些关于 cin 返回值的关键点:
-
输入成功与失败:
当你使用 cin 进行输入时,可以通过 cin 的状态来判断输入是否成功。例如:
int x; if (cin >> x) { // 输入成功 } else { // 输入失败 }
如果输入成功,
cin
会返回一个指向std::istream
对象的引用,这个引用可以被隐式转换为 bool,在成功时为 true,失败时为 false。 -
错误状态:
如果输入格式不匹配(例如,期望一个整数但输入了字母),cin 会进入错误状态,此时:
-
cin.fail()
返回 true。 -
cin.clear()
可以用于清除错误状态,使流恢复为可用状态。 -
cin.ignore()
可以用于忽略流中的剩余字符,直到遇到换行符或指定的字符。
-
-
EOF:
当输入结束(例如,使用 Ctrl+D 在 Unix/Linux 上或 Ctrl+Z 在 Windows 上),cin 也会进入 EOF 状态,此时可以通过
cin.eof()
检查。 -
举一个例子
#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; }
输出如下:
-
附上《c++_primer》这本书里面的一句话(p13):
当我们使用一个
istream
对象作为条件时,其效果是检测流的状态。如果流有效的,即流未遇到错误,那么检测成功。当遇到文件结束符(end-of-file),或遇到一个无效输入时(例如期待读入一个整数,但读入的值不是一个整数),istream
对象的状态会变为无效,处于无效状态的istream
对象会使条件变为假
scanf的返回值
scanf
的返回值是一个整数,表示成功读取的输入项的数量。
具体情况如下:
- 成功读取:
-
如果 scanf 成功读取到所需数量的输入项(如 %d %d 需要读取两个整数),它返回成功读取的项数。
例如:如果成功读取两个整数,返回值为 2。
-
如果只成功读取一个整数(例如,第二个输入不符合格式),返回值为 1。
-
输入结束:
如果在读取过程中遇到文件结束符(EOF),scanf 将返回 EOF(通常是 -1),表示没有更多的数据可供读取。
-
输入错误:
如果输入的格式与预期不匹配,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;
}
输出如下: