关于if(!cin) return false;这行代码相关的一些小结

本文解析了C++程序中如何通过!cin判断用户输入是否有效,并解释了这一机制如何避免程序因错误输入而中断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C++ primer plus第五版的678页的程序清单中,
</pre><ol><li>bool FillReview(Review&rr)</li><li>{</li><li><span style="white-space: pre;">	</span>cout<<"Enter book title (quit to quit):";</li><li><span style="white-space: pre;">	</span>getline(cin,rr.title);</li><li><span style="white-space: pre;">	</span>if(rr.title=="quit")</li><li><span style="white-space: pre;">	</span>return false;</li><li><span style="white-space: pre;">	</span>cout<<"Enter book rating:";</li><li><span style="white-space: pre;">	</span>cin>>rr.rating;<span style="white-space: pre;">	</span></li><li><span style="white-space: pre;">	</span>double a=!cin;</li><li><span style="white-space: pre;">	</span>if(!cin)</li><li><span style="white-space: pre;">		</span>return false;</li><li>while(cin.get()!='\n')</li><li>    continue;</li><li>return true;</li><li>}</li></ol><p>起初见到第10,11行代码的时候是觉得很奇怪,这if(!cin)到底怎么判断?后面跟个return false有啥意义?</p><p>一般if是用来判断括号内的事件真假的,如果!cin不为0就是真,那么if事件成立,则这个函数<span style="white-space:pre">bool FillReview(Review&rr)</span>就要返回false了,而在主函数里面如下</p><p></p><ol><li>int _tmain(int argc, _TCHAR* argv[])</li><li>{</li><li><span style="white-space: pre;">	</span>vector<Review> books;</li><li><span style="white-space: pre;">	</span>Review temp;</li><li><span style="white-space: pre;">	</span>while(FillReview(temp))</li><li><span style="white-space: pre;">		</span>books.push_back(temp);</li><li><span style="white-space: pre;">	</span>int num=books.size();</li><li><span style="white-space: pre;">	</span>if(num>0)</li><li><span style="white-space: pre;">	</span>{</li><li><span style="white-space: pre;">		</span>cout<<"Thank you.You enterd the following:\n"</li><li><span style="white-space: pre;">			</span><<"Rating\tBook\n";</li><li><span style="white-space: pre;">		</span>for(int i=0;i<num;i++)</li><li><span style="white-space: pre;">		</span>{</li><li><span style="white-space: pre;">		</span>  ShowReview(books[i]);</li><li><span style="white-space: pre;">		</span>}</li><li><span style="white-space: pre;">		</span>cout<<"Reprising:\n"</li><li><span style="white-space: pre;">			</span><<"Rating\tBook\n";</li><li><span style="white-space: pre;">		</span>vector<Review>::iterator pr;</li><li><span style="white-space: pre;">		</span>for(pr=books.begin();pr!=books.end();pr++)</li><li><span style="white-space: pre;">			</span>ShowReview(*pr);</li><li><span style="white-space: pre;">		</span> vector<Review>oldlist(books);</li><li><span style="white-space: pre;">		</span> if(num>3)</li><li><span style="white-space: pre;">		</span> { books.erase(books.begin()+1,books.begin()+3);</li><li><span style="white-space: pre;">		</span> cout<<"After eeasure:\n";</li><li><span style="white-space: pre;">		</span> for(pr=books.begin();pr!=books.end();pr++)</li><li><span style="white-space: pre;">			</span> ShowReview(*pr);</li><li><span style="white-space: pre;">		</span> }</li><li><span style="white-space: pre;">	</span>}</li><li><span style="white-space: pre;">	</span>else </li><li><span style="white-space: pre;">		</span>cout<<"Nothing entered,nothing gained.\n";</li><li></li><li></li><li><span style="white-space: pre;">	</span>return 0;</li><li>}</li></ol><pre name="code" class="cpp">
可见bool FillReview(Review&rr)是在主函数的第5行里面作为while(FillReview(temp))的判断值调用的(这里可以明白用一个bool型函数去做if或者while的判断语句是有好处的),如果bool FillReview(Review&rr)返回false那么while(FillReview(temp))就是假,那么跳出while循环,也就是books.push_back(temp)不再执行,也就是不能再添加数据了。如下就要进入主函数的if(num>0)判断了。

所以这里的if(!cin)是关系到整个程序的输入的,所以!cin很重要。

经过调试我发现了,这里
cin>>rr.rating;也就是与rating有关的,

<ol><li><span style="font-family: Arial, Helvetica, sans-serif;">struct Review{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	string title;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	int rating;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">};</span></li></ol>

在这个数据结构里,对于rating是定义为int类型的。

当我在输入非数据类型如abs这样的值给rr.rating的时候,我发先double a=!cin这里的a居然是取值为1了,也就是!cin为1,即是cin为0,也就是if被判断为真。那么就返回了false了,整个输入到此结束了。而我输入123这些正常数字的时候,那么就可以继续。

为此我将rating的类型该为string了,这个时候无论我输入abs还是123,这个时候!cin都为0了,也就是不会进入if语句中了。

如此,我算明白了if(!cin) return false这个组合主要是防止输入错误的数据。

往往是在要求输入int类型这种约束高的数值输入时候要去判断。

下面给出全部代码

<ol><li><span style="font-family: Arial, Helvetica, sans-serif;">// testcode.cpp : 定义控制台应用程序的入口点。</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//</span></li><li>
</li><li>
</li><li><span style="font-family: Arial, Helvetica, sans-serif;">#include "stdafx.h"</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//#include<iostream></span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//#include<string></span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">#include<vector></span></li><li>
</li><li>
</li><li><span style="font-family: Arial, Helvetica, sans-serif;">#include"struct.h"</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">using namespace std;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//struct Review{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">string title;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">int rating;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">//};</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">bool FillReview(Review &rr);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">void ShowReview(const Review &rr);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">int _tmain(int argc, _TCHAR* argv[])</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">vector<Review> books;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">Review temp;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">while(FillReview(temp))</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">books.push_back(temp);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">int num=books.size();</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">if(num>0)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">cout<<"Thank you.You enterd the following:\n"</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">			</span><span style="font-family: Arial, Helvetica, sans-serif;"><<"Rating\tBook\n";</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">for(int i=0;i<num;i++)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">  ShowReview(books[i]);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">}</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">cout<<"Reprising:\n"</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">			</span><span style="font-family: Arial, Helvetica, sans-serif;"><<"Rating\tBook\n";</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">vector<Review>::iterator pr;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">for(pr=books.begin();pr!=books.end();pr++)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">			</span><span style="font-family: Arial, Helvetica, sans-serif;">ShowReview(*pr);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"> vector<Review>oldlist(books);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"> if(num>3)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"> { books.erase(books.begin()+1,books.begin()+3);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"> cout<<"After eeasure:\n";</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"> for(pr=books.begin();pr!=books.end();pr++)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">			</span><span style="font-family: Arial, Helvetica, sans-serif;"> ShowReview(*pr);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"> }</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">}</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">else </span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">cout<<"Nothing entered,nothing gained.\n";</span></li><li>
</li><li>
</li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">return 0;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">}</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">bool FillReview(Review&rr)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">cout<<"Enter book title (quit to quit):";</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">getline(cin,rr.title);</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">if(rr.title=="quit")</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">return false;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">cout<<"Enter book rating:";</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">cin>>rr.rating;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">double a=!cin;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">if(!cin)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;">return false;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">while(cin.get()!='\n')</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">    continue;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">return true;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">}</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">void ShowReview(const Review &rr)</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">{</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">	</span><span style="font-family: Arial, Helvetica, sans-serif;">cout<<rr.rating<<"\t"<<rr.title<<endl;</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;">}</span></li></ol>

# B3817 [语言月赛 202308] 小粉兔还会忘记考试吗 ## 题目描述 小粉兔在本学期共修读了 $N$ 门课程,第 $i$ 门课程的课程代码为 $E_i$,每门课程都需要在结课后进行课程考试。 教务开始处理粉兔的成绩。教务共录入了 $M$ 条成绩信息,一条成绩信息由课程代码和成绩组成。由于成绩可能存在调整,一门课程的成绩可能被重复录入,后录入的成绩将覆盖先录入的成绩。课程成绩在 $60$ 分及以上,该门课程为及格;否则,为不及格。 由于粉兔记性很差,很可能忘记参加某些课程的课程考试。如果教务没有录入粉兔某门课程的成绩,则代表粉兔旷考了该门课程。旷考的课程亦为不及格。 小 F 就是这名教务,小 F 对粉兔旷考和不及格的门数非常感兴趣,请你帮助她统计。 ## 输入格式 输入共 $M+2$ 行。 输入的第一行为两个整数 $N,M$。 输入的第二行为 $N$ 个整数,第 $i$ 个为 $E_i$。 接下来 $M$ 行,每行两个整数 $P_i,S_i$,$P_i$ 表示课程代码,$S_i$ 表示课程成绩。 ## 输出格式 输出两行。 输出的第一行为一个整数,代表小粉兔旷考的课程数。 输出的第二行为一个整数,代表小粉兔不及格的课程数。 ## 输入输出样例 #1 ### 输入 #1 ``` 5 6 10 20 30 40 50 10 20 20 60 30 60 10 59 10 58 10 59 ``` ### 输出 #1 ``` 2 3 ``` ## 说明/提示 对于 $100\%$ 的测试数据,$1 \le N,M \le 5 \times 10^3$,$1 \le E_i,P_i \le 10^9$,$E_i$ 互不相同,$0 \le S_i \le 100$。 保证存在一个整数 $j$,使得 $P_i=E_j$。 #include <iostream> #include <vector> #include <algorithm> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string> #include <bits/stdc++.h> using namespace std; struct Node{ int name; //int score; bool have=false; }a[500]; int main() { int n,m,e,score,num1=0,num2=0; bool isPass[105]={false}; cin>>n>>m; for(int i=0;i<n;i++){ cin>>a[i].name; } for(int i=0;i<m;i++){ cin>>e>>score; for(int j=0;j<n;j++){ if(e==a[j].name) a[j].have= true; if(e==a[j].name&&score>=60) isPass[a[j].name]= true; } } for(int i=0;i<n;i++){ if(a[i].have) num1++; } for(int i=0;i<105;i++){ if(isPass[i]) num2++; } cout<<n-num1<<endl; cout<<n-num2; return 0; } 哪里有问题
最新发布
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值