关于输出的进制问题:
通常情况下使用cout输出,默认输出的是十进制,不管你在源代码里是用什么进制来保存这个数字的。
如果要输出十六进制或者八进制,应该先告诉cout,代码如下:
#include "iostream"
using namespace std;
int main() {
int test = 42;
cout << "decimal for test: " << test << endl;
cout << hex;
cout << "hexadecimal for test: " << test << endl;
cout << oct;
cout << "octal for test: " << test << endl;
return 0;
}
cout << hex;并不是在屏幕上输出任何东西,而是告诉cout,接下来要输出的数字全部用十六进制输出。
(注意:对格式的修改并不局限于接下来的一行)
运行结果如图:
学会使用退格符:
#include "iostream"
#include "string"
#include "cstdlib"
using namespace std;
int main() {
string name;
cout << "Please enter your name:_____\b\b\b\b\b";
//退格后,新输入的字符会替换掉下划线
cin >> name;
cout << "Hello!" << name << endl;
return 0;
}
运行结果如图:
调整字段宽度:
成员函数width(int w)将字段宽度设置为w,并返回以前的字段宽度。这使得能够保存以前的值,以便以后恢复宽度值时使用。
注意,width()方法只影响将显示的下一个项目,然后字段宽度将恢复为默认值。如:
cout << '#';
cout.width(12);
cout << 12 << '#' << 24 << "#\n";
输出是
# 12#24#
说明:12倍放到宽度为12个字符的字段的最右边,这被称为右对齐,且不足的宽度用空格补足。然后,字段宽度恢复为默认值。
填充字符
在默认的情况下,cout用空格填充字段中未被使用的部分,可以用fill()成员函数来改变填充字符。例如,下面的函数调用将填充字符改为星号:
cout.fill('*');
新填充的字符将一直有效,直到更改它为止。
设置精度
precision(int)成员函数可以设置显示的位数.
或者是setprecision(int)非成员函数,该函数定义在iomanip头文件中
显示小数点后几位:
fixed使得输出按定点表示法(相比之于科学表示法)
交替使用fixed和precision(int)或者是setprecision(int)可以控制输出格式为固定的小数点后几位。
#include "iomanip"
#include "iostream"
using namespace std;
int main() {
double temp = 28.3;
cout.precision(5);
cout << fixed << temp << endl;
return 0;
}
或者:
#include "iomanip"
#include "iostream"
using namespace std;
int main() {
double temp = 28.3;
cout << fixed << precision(5) << temp << endl;
return 0;
}
成员函数setf及其他
setf()函数的第一个原型为:
fmtflags setf(fmtflags);其中fmtflags用于储存格式标记,该名称是在ios_base类中定义的。
这个版本的setf()是用来设置单个位控制的格式信息,参数是一个fmtflags值,指出要设置哪一位。返回值是以前的设置。
具体的可用参数如下表:
参数 | 含义 |
---|---|
ios_base::boolalpha | 输入和输出bool值,可以为true或false |
ios_base::showbase | 对于输出,使用C++基数前缀(0、0x) |
ios_base::showpoint | 显示末尾的小数点 |
ios_base::uppercase | 对于十六进制输出,使用大写字母,E表示法 |
ios_base::showpos | 在正数前面加上+ |
setf()函数的第二个原型为:
fmtflags setf(fmtflags, fmtflags);
这里不深入解释两个参数的含义,简单粗暴地给出其具体可用参数和含义:
第二个参数 | 第一个参数 | 含义 |
---|---|---|
ios_base::basefield | ios_base::dec | 使用基数10 |
ios_base::basefield | ios_base::oct | 使用基数8 |
ios_base::basefield | ios_base::hex | 使用基数16 |
ios_base::floatfield | ios_base::fixed | 使用定点计数法 |
ios_base::floatfield | ios_base::scientific | 使用科学计数法 |
ios_base::adjustfield | ios_base::left | 使用左对齐 |
ios_base::adjustfield | ios_base::right | 使用右对齐 |
ios_base::adjustfield | ios_base::internal | 符号或基数前缀左对齐,值右对齐 |
但是,使用setf()不是进行格式化的、对用户最为友好的方法,C++提供了多个控制符,能够调用setf()并自动提供正确的参数。
这些控制符的工作方式与下列格式相似:
cout << left << fixed;
一些标准控制符
控制符 | 调用 |
---|---|
boolalpha | setf(ios_base::boolalpha) |
showbase | setf(ios_base::showbase) |
showpoint | setf(ios_base::showpoint) |
showpos | setf(ios_base::showpos) |
uppercase | setf(ios_base::uppercase) |
internal | setf(ios_base::internal, ios_base::adjustfield) |
left | setf(ios_base::left, ios_base::adjustfield) |
right | setf(ios_base::right, ios_base::adjustfield) |
dec | setf(ios_base::dec, ios_base::basefield) |
hex | setf(ios_base::hex, ios_base::basefield) |
oct | setf(ios_base::oct, ios_base::basefield) |
fixed | setf(ios_base::fixed, ios_base::floatfield) |
scientific | setf(ios_base::scientific, ios_base::floatfield) |