NO.0 cin返回的状态

本文详细介绍了C++中cin的使用方法,特别是其返回输入状态的功能,通过实例展示了如何利用cin的好用之处进行输入验证,确保程序运行的稳定性和可靠性。

        刚开始学c++,有些地方不太明白,百度谷哥之后找到答案,为了以后查阅方便,就记在博客里。cin是接受输入到流中,但使用时不向c语言中的scanf一样有格式转换符,以为它不会返回输入后的状态。其实cin是会返回输入后的状态的。

    #include<iostream>
#include<stdbool.h>


using namespace std;


int main (void)
{
int nu;
cin >>nu;
bool checknu=cin.good();
if(checknu==true)
cout << "Yes"<<endl;
else
cout << "No"<<endl;
cout <<"Hello C++"<<endl;
return 0;
}

有一个good函数,可以检测cin的状态,如这段代码,如果我输入一个非int值,checknu会返回false,由此就可以检测输入的类型是否正确。

#1 Runtime Error 0您的程序返回了1。 1ms 520 KiB #2 Runtime Error 0您的程序返回了1。 1ms 512 KiB #3 Runtime Error 0您的程序返回了1。 2ms 324 KiB #4 Runtime Error 0您的程序返回了1。 2ms 488 KiB #5 Runtime Error 0您的程序返回了1。 1ms 304 KiB #6 Runtime Error 0您的程序返回了1。 2ms 372 KiB #7 Runtime Error 0您的程序返回了1。 2ms 516 KiB #8 Runtime Error 0您的程序返回了1。 2ms 516 KiB #9 Runtime Error 0您的程序返回了1。 2ms 348 KiB #10 Runtime Error 0您的程序返回了1。 1ms 492 KiB #include <iostream> #include <vector> #include <cmath> #include <algorithm> struct Device { int id; double signalStrength; double distance; }; // 估算距离 double estimateDistance(double signalStrength) { return 100.0 / (signalStrength + 1e-6); } // 比较函数,用于按距离排序(降序) bool compareDevices(const Device& a, const Device& b) { return a.distance > b.distance; } int main() { std::vector<Device> devices; int n; std::cin >> n; for (int i = 0; i < n; ++i) { int id; double signalStrength; std::cin >> id >> signalStrength; devices.push_back({id, signalStrength, 0.0}); } if (devices.empty()) { std::cerr << "No devices provided." << std::endl; return 1; } // 估算每个设备的距离 for (auto& device : devices) { device.distance = estimateDistance(device.signalStrength); } // 按距离降序排序 std::sort(devices.begin(), devices.end(), compareDevices); // 输出最远设备的ID和距离 std::cout << devices[0].id << "\n"; std::cout.precision(6); std::cout << std::fixed << devices[0].distance << std::endl; return 0; } 修改错误
最新发布
08-28
### 修复C++运行时错误并修正返回错误代码的问题 C++程序在运行时出现错误并返回错误代码(如 `runtime error: returned 1`)通常表明程序在执行过程中发生了异常或非法操作,例如内存访问越界、未初始化的指针使用、除以零、无效输入读取等。为了修复这些问题,需要从程序结构、输入处理、内存管理和错误检查等多方面入手。 #### 检查并处理无效输入 在设备距离估算程序中,如果输入数据不完整或格式错误,可能导致程序崩溃。例如,未检查输入是否成功读取,可能会导致后续处理访问无效数据。为此,应在读取输入时添加验证逻辑,确保数据的完整性。 ```cpp int n; if (!(std::cin >> n)) { std::cerr << "Invalid input for number of devices." << std::endl; return 1; } ``` 此外,应在读取每个设备数据时也进行验证: ```cpp for (int i = 0; i < n; ++i) { int id; double signalStrength; if (!(std::cin >> id >> signalStrength)) { std::cerr << "Invalid input for device data." << std::endl; return 1; } devices.push_back({id, signalStrength, 0.0}); } ``` #### 防止数组越界访问 在排序后访问 `devices[0]` 时,如果 `devices` 容器为空,将导致段错误。因此,应在访问前检查容器是否为空: ```cpp if (devices.empty()) { std::cerr << "No devices provided." << std::endl; return 1; } ``` #### 确保比较函数满足严格弱序 在调用 `std::sort` 时,比较函数必须满足严格弱序(strict weak ordering)。在当前程序中,比较函数已正确实现降序排序,不会导致未定义行为: ```cpp bool compareDevices(const Device& a, const Device& b) { return a.distance > b.distance; } ``` #### 捕获运行时异常 在某些情况下,程序可能因除以零等数学错误导致崩溃。例如,`estimateDistance` 函数中使用了除法操作: ```cpp double estimateDistance(double signalStrength) { return 100.0 / (signalStrength + 1e-6); } ``` 为避免除以零的错误,应确保 `signalStrength` 不为 `-1e-6`,或者在计算前添加额外检查: ```cpp if (std::abs(signalStrength) < 1e-6) { std::cerr << "Signal strength too low,可能导致除以零错误。" << std::endl; return 0.0; } ``` #### 修正返回错误代码问题 在程序执行过程中,如果发生错误,应通过 `return 1;` 明确返回错误代码,而不是让程序因异常终止而返回非零状态。确保所有错误路径都正确返回错误代码,有助于调试和日志记录。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值