本文包括:C++基本的输入输出、C++如何输入含空格的字符串、C++输入输出的格式控制。
本文介绍的内容适用于控制台程序,这样才能看到输入与输出的结果,GUI(图形用户界面)的程序就用不上了。
cin和cout
在C语言中,标准的键盘输入和屏幕输出功能分别使用scanf()和printf()两个函数实现。在C++语言中,类库中提供了输入流类istream和输出流类ostream。cin和cout分别是istream类和ostream类的对象,用来实现基本的键盘输入和屏幕输出。 引入头文件iostream后,就可以使用cin和cout。
cin和cout是 C++ 的内置对象(预定义的流类对象),cin用来处理标准输入,即键盘输入,因此也称cin是标准输入流对象。cout用来处理标准输出即屏幕输出,因此也称cout是标准输出流对象。
<<和>>
从输入流中获取数据的操作称为提取操作,向输出流中添加数据的操作称为插入操作。运算符“>>”和“<<”是移位运算符,但在C++类库中的头文件中已经对“>>”和“<<”进行了重载,使之分别作为流提取运算符和流插入运算符,用来输入和输出C++标准类型的数据。。例如,语句“cin>>x;”从键盘获取输入数据并赋给变量x。使用cin可以获得多个来自键盘的输入值。cout是一个标准输出流对象,使用流插入运算符“<<”向输出设备屏幕输出信息。当程序中用到cin和cout时,需要在程序中包含头文件。
cin的一般格式如下:
cin>> <变量名1>[>> <变量名2> >>…>> <变量名n>];
程序执行到这条语句便暂停下来,等待从键盘上输入相应数据,直到所列出的所有变量均获得值后,程序方继续执行。
cout的一般格式如下:
cout<< <表达式1> [<< <表达式2> <<…<< <表达式n>];
程序执行到这条语句时,将紧跟其后的表达式的值输出到显示器上。
注意,使用cin和cout必须在程序开头增加一行:
# include
或者两行:
# include
using namespace std;
【c++中的#include和using指令(directive)的作用
#include用于包含其他文件的内容,如用来引入对应的头文件。
using namespace std;这个using声明是将std命名空间内的名字,全部暴露在外,只要访问std命名空间内的名字,我们都不需要在cin、cout之前写额外的前缀std::。
更多情况,可参见https://blog.51cto.com/u_15314328/4965070】
下面给出一个例子,贺卡
#include
using namespace std;
int main(void)
{
string friendName;
string selfName;
cout<<"请输入朋友的名字:";
cin>>friendName;
cout<<"请输入你的名字:";
cin>>selfName;
cout<<"===================================="<
用Dev-C++编译运行之:
cin是C++中最常用的输入,用空格或者回车键分隔数据。如用cin>>str;这种方法来接收字符串那么录入的str不能包含空格,否则它会按照空格将整个字符串切分成若干段。
cin>>a;
cout<
如何输入含有空格字符串呢? 可以使用get()、getline()函数 头文件 get 函数是内置在 cin 对象中的,所以可称之为 cin 的一个成员函数。下面仅介绍两种用法,详情可见istream::get - C++ Reference 用法1: cin.get(字符变量名) 可以用来接收字符,示例源码: 用Dev-C++编译运行之: 用法2:cin.get(字符数组名,接收字符数目) 用来接收一行字符串,可以接收空格,示例源码: 用Dev-C++编译运行之: 在C++中有两种getline()函数,一种在头文件 头文件 cin.getline 允许读取包含空格的字符串,其语法为: getline (char* s, streamsize n [, char delim] ); 参见istream::getline - C++ Reference s:它是指向字符串以存储字符的指针。 n:它表示由a指向的最大字符数。 delim:这是一个明确的定界字符,默认是 '\n '。 返回值 读取n-1个字符(第n个用于保存'/0'),或者遇到指定的定界字符为止。 可用来接收一行含有空格的字符串,示例源码: 用Dev-C++编译运行之: 头文件 string版本的getline()函数有自动调整大小的功能,不需要指定读取多少个字符的数值参数,其语法为: getline (istream& is, string& str [, char delim]); 参见getline (string) - C++ Reference 参数 is:表示一个输入流,例如 cin。 str:用来存储输入流中的信息 delim:定界字符,默认是 '\n ' 可用来接收一行含有空格的字符串,示例源码: 用Dev-C++编译运行之: 关于C++中getline()的更多情况,可见 https://www.jb51.net/article/180289.htm 在没有特地进行格式控制的情况下,输入输出采用默认格式,先看一下这种情况是什么样的。 默认的输入格式 C++流所识别的输入数据的类型及其默认的输入格式: short、int 、long(signed 、unsigned):与整型常量同; float、double、long double:与浮点数常量同; char(signed、unsigned):第一个非空白字符; char *(signed 、unsigned):从第一个非空白字符开始到下一个空白字符结束; void *:无前缀的16进制数; bool:把true或1识别为true,其他的均识别为false(VC6.0中把0识别为false,其他的值均识别为true)。 示例源码#include
#include
#include
#include
C++输入输出的格式控制
#include
请分析一下,为何请输入:123 456abcdefgh ijklm
输出a=123 b=456 c=a d=bcdefgh
默认的输出格式
C++流所识别的输出数据的类型及其默认的输出格式:
char(signed、unsigned):单个字符(无引号);
short、int、long(signed 、unsigned):一般整型形式,负数前有-号;
char *(signed 、unsigned):字符序列(无引号);
float 、double 、long double:浮点格式或指数格式(科学表示法),取决于哪个更短;
void *:无前缀的16进制数;
bool:1或0。
示例源码
#include
using namespace std;
main ()
{
char c='A';
const char *p="hello!";
cout<<123<
用Dev-C++编译运行之:
进行输入输出的格式控制,可以使用iostream库,需要加入头文件#include
iostream库
在C++中,iostream头文件,iostream 是 Input Output Stream 的缩写,意思是“输入输出流”,提供了 cin对象(一般情况下代表显示器) 和 cout对象(一般情况下代表显示器),分别用于从标准输入读取流 和 向标准输出写入流。
cin 就是 istream 类的对象,cout 是 ostream 类的对象,它们都声明在
iostream库的每个iostream对象还维护着一个格式状态来控制IO格式化细节。
关于iostream库详情可见如下链接
https://cplusplus.com/reference/iostream/
https://www.apiref.com/cpp-zh/cpp/header/iostream.html
https://blog.csdn.net/m0_60073820/article/details/121319269
iostream库定义了一组操纵符来修改流的格式状态。操纵符是一个函数或对象,会影响流的状态,并能作为输入和输出运算符的运算对象。
操纵符用于两大类输出控制:控制数值的输出格式,控制补白的数量和位置。大多数改变格式状态的操纵符都是设置/复原成对的,一个操纵符用于设置新格式,另一个用于恢复正常格式。
当操纵符改变流的格式状态时,通常改变后的状态对所有后续IO都生效。
bool值默认打印0或1,可以对流使用boolalpha来操纵覆盖这种格式,示例源码:
#include
using namespace std;
main ()
{
cout << "default bool values: " << true << " " << false<< endl;
cout << boolalpha;
cout << "boolalpha bool values: " <
用Dev-C++编译运行之:
默认输出十进制,可以用hex、oct和dec改为十六进制、八进制和十进制。只影响整型。
示例源码:
#include
using namespace std;
main ()
{
cout << "default: " << 20 << " " << 1024 << endl;
cout << "octal: " << oct << 20 << " " << 1024 << endl;
cout << "hex: " << hex << 20 << " " << 1024 << endl;
cout << "decimal: " << dec << 20 << " " << 1024 << endl;
return 0;
}
用Dev-C++编译运行之:
控制浮点数格式
浮点数的输出格式涉及三个方面:
输出精度(即输出多少个数字)。
十六进制、定点十进制或者科学记数法形式输出。
没有小数部分的浮点值是否输出小数点。
默认情况下,浮点值按六位数字精度输出;如果浮点值没有小数部分,则不输出小数点;根据浮点数的值选择输出为定点十进制或科学计数法形式:非常大或非常小的值输出为科学记数法形式,其他值输出为定点十进制形式。
默认情况下,精度控制输出的数字总位数。输出时,浮点值按照当前精度四舍五入而非截断。
调用IO对象的precision成员或者使用setprecision操纵符可以改变精度。
示例源码:
#include
#include
using namespace std;
main ()
{
// cout.precision返回当前精度值
cout << "Precision: " << cout.precision() << ", Value: " << sqrt(2.0) << endl;
// cout.precision(12)将打印精度设置为12位数字
cout.precision(12);
cout << "Precision: " << cout.precision() << ", Value: " << sqrt(2.0) << endl;
return 0;
}
用Dev-C++编译运行之:
c++设置域宽
用于存放输出数据的宽度称为“域宽”。浮点数的域宽包含小数点。
如果所需的宽度比设置的域宽小,空位用填充字符填充。如果显示数据所需的宽度比设置的域宽大,系统输出所有位。域宽设置仅对下一行流读入或流插入操作有效,在一次操作完后被置0。
指定输入域宽示例源码:
#include
using namespace std;
main ()
{
char str[20],str2[20];
cout << "请输入一段文本: ";
cin.width(5);
cin>>str; //cin>>str;实际只能提取4个字符,str最后一个是空字符,其他的放在流中等待接受。
cout<>str2;
cout<
用Dev-C++编译运行之:
指定输出域宽示例源码:
#include
using namespace std;
main ()
{
cout<<"abc123"<
用Dev-C++编译运行之:
cin与cout都可以指定域宽。上面的例子是用iostream库的cin.width函数成员指定输入域宽,cout.width函数成员指定输出域宽。
也可以iomanip库setw指定输入和输出域宽。
用iomanip库的setw函数指定输入和输出域宽需要加入头文件#include
#include
#include
using namespace std;
main ()
{
char d[10];
cout<<"Please enter a text:";
cin>>setw(5);
cin>>d;
cout <
用Dev-C++编译运行之:
关于iomanip库 https://cplusplus.com/reference/iomanip/
或 https://www.yiibai.com/cpp_standard_library/iomanip.html
Iomanip库简介如下
编号 |
方法和描述 |
1 |
setiosflags - 它用于设置格式标志。 |
2 |
resetiosflags - 用于重置格式标志。 |
3 |
setbase - 它用于设置basefield标志。 |
4 |
setfill - 它用于设置填充字符 |
5 |
setprecision - 它用于设置小数精度。 |
6 |
setw - 它用于设置字段宽度。 |
控 制 符 |
作 用 |
dec |
设置整数为十进制 |
hex |
设置整数为十六进制 |
oct |
设置整数为八进制 |
setbase(n) |
设置整数为n进制(n=8,10,16) |
setfill(n) |
设置字符填充,c可以是字符常或字符变量 |
setprecision(n) |
设置浮点数的有效数字为n位 |
setw(n) |
设置字段宽度为n位 |
setiosflags(ios::fixed) |
设置浮点数以固定的小数位数显示 |
setiosflags(ios::scientific) |
设置浮点数以科学计数法表示 |
setiosflags(ios::left) |
输出左对齐 |
setiosflags(ios::right) |
输出右对齐 |
setiosflags(ios::skipws) |
忽略前导空格 |
setiosflags(ios::uppercase) |
在以科学计数法输出E与十六进制输出X以大写输出,否则小写。 |
setiosflags(ios::showpos) |
输出正数时显示"+"号 |
setiosflags(ios::showpoint) |
强制显示小数点 |
resetiosflags() |
终止已经设置的输出格式状态,在括号中应指定内容 |
下面给出示例
#include
#include
using namespace std;
int main()
{
// 前缀0表示八进制 前缀0x表示十六进制 不带前缀表示十进制
int a = 123;
double pi = 22.0/7.0;
// setbase(n) 设置整数为n进制(n=8,10,16)
// oct 八进制 dec 十进制 hex 十六进制
// setiosflags(ios::showbase) 显示进制的前缀
// 数值默认十进制显示输出
cout << a << endl;
cout << "oct: " << showbase << setbase(8) << a << " " << oct << a << endl;
cout << "dec: " << showbase << setbase(10) << a << " " << dec << a << endl;
cout << "hex: " << showbase << setbase(16) << a << " " << hex << a << endl;
// setprecision(n) 设置浮点数的有效数字为n位
// 有效位数默认是6位,即setprecision(6),即小数点前面和小数点后面加起来的位数为6个有效数字(注意会四舍五入)
cout << pi << endl;
cout << setprecision(12) << pi << endl;
// setfill(n) 设置字符填充,c可以是字符常或字符变量
// setw(n) 设置字段宽度为n位, 若是实际宽度大于被设置的,则setw函数此时失效, 只针对其后的第一个输出项有效
// setiosflags(ios::left) 输出左对齐
// setiosflags(ios::right) 输出右对齐 默认右对齐
cout << setfill('*') << setw(20) << setprecision(12) << pi << endl;
cout << setfill('*') << setw(20) << setprecision(12) << right << pi << endl;
cout << setfill('*') << setw(20) << setprecision(12) << left << pi << endl;
// setiosflags(ios::fixed) 设置浮点数以固定的小数位数显示
cout << fixed << setprecision(12) << pi << endl;
// setiosflags(ios::scientific) 设置浮点数以科学计数法表示 科学计数法输出E与十六进制输出默认是以小写的,要换成大写需添加uppercase
cout << scientific << setprecision(12) << pi << endl;
cout << scientific << uppercase << setprecision(12) << pi << endl;
// resetiosflags() 终止已经设置的输出格式状态,在括号中应指定内容
cout << setiosflags(ios::scientific) << setprecision(12) << pi << " " << resetiosflags(ios::scientific) << pi << endl;
return 0;
}
用Dev-C++编译运行之:
附录、C++学习资源
C++ [中文] https://runebook.dev/zh-CN/docs/cpp/-index-
C++ 参考手册 https://www.apiref.com/cpp-zh/cpp.html
https://cplusplus.com/reference/