C++输出输入小结
题目:
这个程序将向用户提出一个“Y/N”问题,然后把用户输入的值赋值给answer变量。
要求:
针对用户输入‘Y’或‘y’和‘N’或‘n’进行过滤;
发掘程序可能存在的任何问题,想想为什么?
1 #include <iostream> 2 3 int main() 4 { 5 char answer; 6 7 std::cout << "¿ÉÒÔ¸ñʽ»¯ÄúµÄÓ²ÅÌÂð?[Y/N]"; 8 std::cin >> answer; 9 std::cout << " "; 10 11 switch( answer ) 12 { 13 case 'Y': 14 case 'y': 15 std::cout << "ÎÒÏ뻹ÊDZðÁË, Êý¾Ý¶ªÁËÂèÂè»áÂîµÄ~" << " "; 16 break; 17 18 case 'N': 19 case 'n': 20 std::cout << "ÄúµÄÑ¡ÔñÊÇÕýÈ·µÄ, Ó²Å̲»ÄÜËæ±ã¸øÈ˸ñʽ»¯!" << " "; 21 break; 22 23 default: 24 std::cout << "ÇëÊäÈë[Y/N]»Ø´ðÎÊÌâ¡£" << " "; 25 break; 26 } 27 28 std::cout << "ÊäÈëÈÎÒâ¼ü½áÊø³ÌÐò!" << " "; 29 std::cin.get(); 30 std::cin.ignore(100, ' '); 31 32 return 0; 33 }
题目:
编写一个“温度单位转换程序”,提示用户以【xx.x C】或【xx.x F】的格式输入。
要求:
如果用户输入的是34.2 C 程序将自动转换为 90.32 F 并输出!
1 #include <iostream> 2 3 int main() 4 { 5 const unsigned short ADD_SUBTRACT = 32; 6 const double RATIO = 9.0 / 5.0; 7 8 float tempIn, tempOut; 9 char typeIn, typeOut; 10 11 std::cout << "ÇëÒÔ¡¾xx.x C¡¿»ò¡¾xx.x F¡¿µÄÐÎʽÊäÈëζÈ: "; 12 std::cin >> tempIn >> typeIn; 13 std::cin.ignore(100, ' '); 14 std::cout << " "; 15 16 switch( typeIn ) 17 { 18 case 'C': 19 case 'c': 20 tempOut = (tempIn * RATIO) + ADD_SUBTRACT; 21 typeOut = 'F'; 22 typeIn = 'C'; 23 break; 24 25 case 'F': 26 case 'f': 27 tempOut = (tempIn - ADD_SUBTRACT) / RATIO; 28 typeOut = 'C'; 29 typeIn = 'F'; 30 break; 31 32 default: 33 typeOut = 'E'; 34 break; 35 } 36 37 if( typeOut != 'E' ) 38 { 39 std::cout << tempIn << typeIn << " = " << tempOut << typeOut << " "; 40 } 41 else 42 { 43 std::cout << "Çë°´ÕÕ¸ø³ö¸ñʽÊäÈë!" << " "; 44 } 45 46 std::cout << "ÇëÊäÈëÈÎÒâ×Ö·û½áÊø!" << " "; 47 std::cin.get(); 48 49 return 0; 50 }
对输入数据进行合法性检查
“不要相信任何程序的输入,尤其是由用户输入的东西”,这是计算机安防工作的基本原则。
往好处说,非法输入会让程序变得毫无用处;
往坏处说,非法输入会导致程序甚至是整个系统崩溃。
因此,知道如何对输入数据进行合法性检查与知道如何接受输入数据同样重要。
这是我们这系列要研究的一个重要课题!
对输入数据进行合法性检查的具体做法取决于具体的变量类型和它们的取值范围。
比较常见的检查项目包括:
检查某个数值是不是一个正数(例如商品的价格、老妈的年龄、老婆的体重)
检查某个数值是不是落在给定的范围(例如女朋友的年龄不能小于0或者大于120吧?)
检查某个字符是不是一个特定的值(例如前边的Y或者N)
前边的程序中我们已经见过了一些用来进行合法性检查的代码,例如question1和question2程序中使用switch()来判断用户是否输入了程序预期的值。
但是呢,还有一些潜伏的问题我们没有发掘出来:例如cin调用失败(无法把一个值赋值给一个变量)时,程序仍会像cin调用成功一样继续自欺欺人。举例……
解决这些问题的办法之一就是对cin 调用的结果不要做任何假设。
cin 对象有几个专门用来报告其工作情况的成员函数,它们将返回一个真/假值来表明cin 的状态。
eof():如果到达文件(或输入)末尾,返回true;
fail():如果cin 无法工作,返回true;
bad():如果cin 因为比较严重的原因(例如内存不足)而无法工作,返回true;
good():如果以上情况都没发生,返回true。