四.控制台交互(Communication through console)
在 C++的 iostream 函数库中,一个程序的标准输入输出操作依靠两种数据流:cin 给输入使用和 cout 给输出使用。另外,cerr 和 clog 也已经被实现――它们是两种特殊设计的数据流专门用来显示出错信息。它们可以被重新定向到标准输出设备或到一个日志文件(log file)。
因此 cout (标准输出流)通常被定向到屏幕,而 cin (标准输入流)通常被定向到键盘。
通过控制这两种数据流,你可以在程序中与用户交互,因为你可以在屏幕上显示输出并从键盘接收用户的输入。
1.输出 Output (cout)
输出流 cout 与重载(overloaded)运算符<<一起使用:
cout << "Output sentence"; // 打印 Output sentence 到屏幕上
cout << 120; // 打印数字 120 到屏幕上
cout << x; // 打印变量 x 的值到屏幕上
运算符<<又叫插入运算符(insertion operator) 因为它将后面所跟的数据插入到它前面的数据流中。在以上的例子中,字符串常量 Output sentence,数字常量 120 和变量 x先后被插入输出流 cout 中。注意第一句中字符串常量是被双引号引起来的。每当我们使用字符串常量的时候,必须用引号把字符串引起来,以便将它和变量名明显的区分开来。
例如,下面两个语句是不同的:
cout << "Hello"; // 打印字符串 Hello 到屏幕上
cout << Hello; // 把变量 Hello 存储的内容打印到屏幕上
插入运算符 insertion operator (<<)可以在同一语句中被多次使用:
cout << "Hello, " << "I am " << "a C++ sentence";
上面这一行语句将会打印 Hello, I am a C++ sentence 到屏幕上。插入运算符(<<) 的
重复使用在我们想要打印变量和内容的组合内容或多个变量时有所体现:
cout << "Hello, I am " << age << " years old and my zipcode is " << zipcode;
如果我们假设变量 age 的值为 24,变量 zipcode 的值为 90064,以上句子的输出将为:
Hello, I am 24 years old and my zipcode is 90064
必须注意,除非我们明确指定,cout 并不会自动在其输出内容的末尾加换行符,因此下
面的语句:
cout << "This is a sentence.";
cout << "This is another sentence.";
将会有如下内容输出到屏幕:
This is a sentence.This is another sentence.
虽然我们分别调用了两次 cout,两个句子还是被输出在同一行。所以,为了在输出中换
行,我们必须插入一个换行符来明确表达这一要求。在 C++中换行符可以写作\n:
cout << "First sentence.\n ";
cout << "Second sentence.\nThird sentence.";
将会产生如下输出:
First sentence.
Second sentence.
Third sentence.
另外,你也可以用操作符 endl 来换行,例如:
cout << "First sentence." << endl;
cout << "Second sentence." << endl;
将会输出:
First sentence.
Second sentence.
当操作符 endl 被用在 buffered streams 中时有一点特殊:它们被 flushed。不过 cout 默认为 unbuffered,所以不会被影响。 你可以暂时不管这一点。
你可以使用\n 或 endl 来指定 cout 输出换行,请注意前面所讲的两者的不同用法。
输入 Input (cin)
C++中的标准输入是通过在 cin 数据流上重载运算符 extraction (>>) 来实现的。它后必须跟一个变量以便存储读入的数据。例如:
int age;
cin >> age;
声明一个整型变量 age 然后等待用户从键盘输入到 cin 并将输入值存储在这个变量中。
cin 只能在键盘输入回车键(RETURN)后才能处理前面输入的内容。因此即使你只要求输入一个单独的字符,在用户按下回车键(RETURN)之前 cin 将不会处理用户的输入的字符。在使用 cin 输入的时候必须考虑后面的变量类型。如果你要求输入一个整数,extraction(>>) 后面必须跟一个整型变量,如果要求一个字符,后面必须跟一个字符型变量,如果求一个字符串,后面必须跟一个字符串型变量。
// i/o example
Please enter an integer
31/ 170
#include
int main ()
{
int i;
cout << "Please enter an integer value: ";
cin >> i;
cout << "The value you entered is " << i;
cout << " and its double is " << i*2 << ".\n";
return 0;
}
value: 702
The value you entered is
702 and its double is
1404.
使用程序的用户可以使引起错误的原因之一,即使是在最简单的需要用 cin 做输入的程序中(就像我们上面看到的这个程序)。因为如果你要求输入一个整数数值,而用户输入了一个名字(一个字符串),其结果可能导致程序产生错误操作,因为它不是我们期望从用户处获得的数据。当你使用由 cin 输入的数据的时候,你不得不假设程序的用户将会完全合作而不会在程序要求输入整数的时候输入他的名字。后面当我们看到怎样使用字符串的时候,我们将会同时看到一些解决这一类出错问题的办法。
你也可以利用 cin 要求用户输入多个数据 :
cin >> a >> b;
等同于:
cin >> a;
cin >> b;
在以上两种情况下用户都必须输入两个数据,一个给变量 a,一个给变量 b。输入时两个
变量之间可以以任何有效的空白符号间隔,包括空格,跳跃符 tab 或换行。
cin 和字符串
我们可以像读取基本类型数据一样,使用 cin 和>>操作符来读取字符串,例如:
cin >> mystring;
但是,cin >> 只能读取一个单词,一旦碰到任何空格,读取操作就会停止。在很多时候
这并不是我们想要的操作,比如我们希望用户输入一个英文句子,那么这种方法就无法读取完整的句子,因为一定会遇到空格。
要一次读取一整行输入,需要使用 C++的函数 getline,相对于是用 cin,我们更建议使用 getline 来读取用户输入。
例如:
// 读取字符串例子
#include
#include
using namespace std;
int main ()
{
string mystr;
cout << "What's your name? ";
getline (cin, mystr);
cout << "Hello " << mystr << ".\n";
cout << "What is your favorite color? ";
getline (cin, mystr);
cout << "I like " << mystr << " too!\n";
return 0;
}
结果:
What's your name? Aqua
Hello Aqua.
What is your favorite
color? blue
I like blue too!
你可能注意到在上面的例子中,两次调用 getline 函数我们都是用了同一个字符串变量(mystr)。在第二次调用的时候,程序会自动用第二次输入的内容取代以前的内容。
字符串流
标准头文件 定义了一个叫做
stringstream 的类,使用这个类可以对基于
字符串的对象进行像流(stream)一样的操作。这样,我们可以对字符串进行抽取和插入操作,这对将字符串与数值互相转换非常有用。例如,如果我们想将一个字符串转换为一个整数,可以这样写:
string mystr ("1204");
int myint;
stringstream(mystr) >> myint;
这个例子中先定义了一个字符串类型的对象 mystr,初始值为"1204",又定义了一个整数变量 myint。然后我们使用 stringstream 类的构造函数定义了这个类的对象,并以字符串变量 mystr 为参数。因为我们可以像使用流一样使用 stringstream 的对象,所我们可以像使用 cin 那样使用操作符 >> 后面跟一个整数变量来进行提取整数数据。这段代码执行之后变量 myint 存储的是数值 1204 。
// 字符串流的使用示例
#include
#include
#include
using namespace std;
int main ()
{
string mystr;
float price=0;
int quantity=0;
cout << "Enter price: ";
getline (cin,mystr); //输入字符串形式的Price
stringstream(mystr) >> price; //转换为浮点类型
cout << "Enter quantity: ";
getline (cin,mystr); //输入字符串形式的quantity
stringstream(mystr) >> quantity;//转换为浮点类型
cout << "Total price: " << price*quantity << endl;
return 0;
}
Enter price: 22.25
Enter quantity: 7
Total price: 155.75
在这个例子中,我们要求用户输入数值,但不同于从标准输入中直接读取数值,我们使用函数 getline 从标注输入流 cin 中读取字符串对象(mystr),然后再从这个字符串对象中提取数值 price 和 quantity。
通过使用这种方法,我们可以对用户的输入有更多的控制,因为它将用户输入与对输入的解释分离,只要求用户输入整行的内容,然后再对用户输入的内容进行检验操作。这种做法在用户输入比较集中的程序中是非常推荐使用的。
文章评论(0条评论)
登录后参与讨论