CPP入门(3):输入、输出
获得字符串输入
int length;
std::string name,name1,name2;
std::cout << "Enter your name: ";
std::cin >> name; //cin使用空白字符作为输入字符串的结束标志
length = name.size(); //返回某给定字符串里的字符个数 ,一个中文字或者中文标点符号占2个字节
std::cout << name << "\t" << length << std::endl;
std::cin >> name1 >> name2; //一次读取多个字符值
std::cout << name1 << "\t" << name2 << std::endl;
cin对象在读入一个字符时将忽略空格,如果想读入任意一个字符,包括各种空白字符,可以使用cin对象的get()函数
char myChar;
std::cin.get(myChar)
读入一整行输入,可以使用std::getline()函数,调用它时,需要给出输入流的名字(比如“cin” )作为第一个输入参数,用来保存输入值的变量是第二个输入参数。
我们必须保证在调用std::getline()之前缓冲区里没有任何多余的输入:比如先读取一个整数,再读取一行文本,用户可能输入27后按下回车键,在把27赋给一个整数变量后,那个回车符还留在缓冲区,这将使得下一个std::getline()调用立刻停止读取输入
std::string inputTxt;
std::cout << "Say something !!" << std::endl;
std::getline(std::cin,inputTxt); //默认情况下,读取数据,直到它遇到一个换行符,换行符是文本行的结束标志
std::getline(std::cin,inputTxt,'#'); //getline()还有一个可选的第3个参数,用来定义一个停止字符
std::cout << inputTxt << std::endl; //读取数据,直到它遇到一个#停止
std::getline()函数会丢弃作为作为文本行结束标记的字符,不管是换行符还是其它停止字符。
如果要丢弃输入数据(从缓冲区里删除它,不对它做任何处理),则可以使用ignore()函数
std::cin.ignore() ; //丢弃单个字符
std::cin.ignore(7) ; //丢弃一定数量的字符,此处为7个
std::cin.ignore(10,'\n') ; //可选的第二个参数是告诉ignore()函数在读到什么字符时停止执行,此处为丢弃10个字符或直到它遇到一个换行符停止
如果想删除整个缓冲区而不仅限于特定数量的字符,可以使用gcount()函数,它将返回缓冲区里的字符个数
std::cin.ignore(std::cin.gcount()+1) ;
对输入数据进行合法性检查
cin对象有几个专门用来报告其工作情况的成员函数,它们将返回一个真/假值来表明cin的状态:
std::cin.eof():如果到达文件(或输入)的末尾,返回true
std::cin.fail():如果cin无法工作,返回true
std::cin.bad():如果cin因为比较严重的原因(比如内存不足)而无法工作,返回true
std::cin.good():如果以上情况都没发生,返回true
如果cin为假或者cin.fail()或cin.bad()调用的返回值是true,说明有问题发生了,这类问题的基本处理步骤是:
先调用std::cin.clear()函数清除cin的出错状态,再调用std::cin.ignore()函数把缓冲区里的现有输入全部丢弃(clear()只清除出错状态,不清理输入缓冲区)
int age;
while(!(std::cin >> age))
{
std::cin.clear();
std::cin.ignore(std::cin.gcount()+1,'\n') ;
std::cout << "Please enter your age again: " ;
}