C++char类型和输⼊输出优化
⽬录
1、char类型
2、getchar、putchar、、cout.put
3、输⼊输出中⽂
1、char类型
char的全称是character,也就是字符的意思。顾名思义,char类型是专门为了存储字符⽽设计的。
计算机存储数字⾮常⽅便,只需要将其转化成⼆进制即可。但存储字符就有点⿇烦了,⼀般都是通过对字符进⾏数字化编码。这也就是为什么char类型本质上是另外⼀种整数,因为它存储的其实是字符的数字编码。
char⼀共有8个⼆进制位,即⼀个字节,理论上能够存储256个字符。基本上⾜够涵盖计算机当中所有的字母、标点符号以及数字,即ASCII码。
ASCII的全称是美国信息交换标准代码,它是⼀套电脑编码系统,包含了所有英⽂字母以及标点符号和⼀些特殊字符。全表⼀共有128个字符,刚好可以⽤⼀个char(有符号)来存储。
⼤家可以参考⼀下下表,Dec表⽰编号,Char表⽰字符。
其中数字0的编号是48,字母a的编号是97,⼤写字母A的标号是65。
当我们把⼀个字符赋值给char型变量的时候,它会去查ASCII表,到字符对应的编号。同样,当我们使⽤%c输出⼀个字符的时候,它也会去寻char中存储的编码对应的符号进⾏输出。
既然字符在C++当中都是以数字的形式存储的,那么我们就可以对它来进⾏加减运算。
⽐如:
char c = 'a';
cout << ++c << endl;
得到的结果是'b',有加⾃然也有减,我们也可以对它做减法操作。
char c = 'b';
cout << --b << endl;
得到的结果就是'a'。
另外,我们还可以对于两个char类型的变量进⾏减法操作。⽐如⽤得⽐较多的就是将字符型的数字转成int型。
char c = '1';
int num = c - '0';
这样我们得到的num就是数字型的1。
再⽐如,我们还可以通过⼤于⼩于符号来判断char类型的范围:
char c = '1';
if (c >= '0' && c <= '9') {
cout << "c is a number" << endl;
}
2、getchar、putchar、、cout.put
getchar和putchar都是C语⾔当中专门⾯向字符IO的函数,也就是读⼊和输出字符的函数。
因为确定了处理的数据类型是字符,不需要额外的格式说明,因此getchar和putchar的效率要⽐scanf和printf更⾼。
所以在算法竞赛领域,有⼈为了提升程序的性能,丧⼼病狂地使⽤getchar代替scanf来读⼊数据。
我这⾥贴⼀段使⽤getchar来读⼊int型的代码,给⼤家做⼀个参考。这个属于标准的奇淫技巧,不推荐使⽤。
void read(int &x) {
int f = 1; x = 0; char s = getchar();
while (s < '0' || s > '9') {
if (s == '-') {
f = -1;
s = getchar();
}
}
while (s >= '0' && s <= '9') {
x = x * 10 + s - '0';
s = getchar();
}
x *= f;
}
<和cout.put与getchar和putchar的⽤法类似,只不过是C++当中的特性。⼤家可以参考⼀下下⾯这个例⼦,就不过多赘述了。char c;
<(c);
cout.put(c);
3、输⼊输出中⽂
关于这⼀段我犹豫了很久要不要加,因为实在是没有相关经验,毕竟之前只刷题了。纠结了很久还是决定写上,因为这个问题对于不少同学应该挺重要的,尤其是想要做C++⼯程的同学。本⼈⽔平有限,勉强整理了⼀下各⽅资料,如有错误,欢迎指出~
其实直接在C++当中是可以直接输出中⽂的,这并不会有什么问题。
⽐如下列代码,是可以完美运⾏的:
string str;
cin >> str;
cout << str << endl;
cout << str.length() << endl;
只是为什么最后输出的长度是6?因为我是在Mac上跑的这段代码。在Mac当中默认使⽤utf-8编码,⼀个
汉字的长度是3个字节。C++当中的字符串计算长度的时候统计的是字节的数量,所以两个汉字的长度是6。
如果我们是在源代码当中写⼊了中⽂,⽐如:
string str = "中⽂";
cout << str << endl;
这就可能⼀些问题,最常见的问题就是代码存储环境和运⾏环境的默认编码不同,⽐如IDE当中默认是utf-8编码,但是终端默认是gbk编码(windows系统常见)。这就会导致输出的结果是乱码。
解决⽅案是我们可以使⽤wchar_t,wchar_t即char的宽类型版本,它占据两个字节。可以⽤来存储unicode编码的字符:
const wchar_t* str = L"中⽂";
我们在中⽂两个字之前加上了L修饰符,它告诉编译器,这是⼀个宽字符,我们需要编译器根据locale来进⾏翻译。
locale是指根据计算机⽤户使⽤的语⾔、所在的国家或地区以及⽂化传统⽽定义的软件运⾏时的语⾔环境。可以将locale理解为⼀系列环境变量。locale环境变量值的格式为language_area.charset。languag表⽰语⾔,例如英语或中⽂;area表⽰使⽤该语⾔的地区,例如美国或者中国⼤陆;charset表⽰字符集编码,例如UTF-8或者GBK。
这些环境变量会对⽇期格式,数字格式,货币格式,字符处理等多个⽅⾯产⽣影响。在Linux系统下打开Terminal,输⼊locale命令,就可查看当前系统使⽤的语⾔环境。
locale的结果包含12类,我在⽹上也到了表格:
LANG指的是未设置的默认值,⼤部分程序应⽤LANGUAGE指定的语⾔作为界⾯语⾔。LC_ALL同时设置所有的内容,并且其优先级⽐每个内容单独设置的优先级都⾼,⽽LANG的优先级最低。
cin和cout可以看成是针对char的流,所以不适合应⽤在wchar_t类型的处理上。与之对应我们应该使⽤wcin和wcout。⽽wcout默认采⽤的是C local,并不认识中⽂,所以我们要先对wcout的local进⾏设置。将其设置成和运⾏环境的local⼀致。
⼤约有以下⼏种设置⽅法:
#include <codecvt>
const wchar_t* str = L"中⽂";
// 使⽤默认local
locale loc("");
wcout.imbue(loc);
// 使⽤local命令显⽰的结果
locale loc("en_US.UTF-8");
字符串长度1是什么意思wcout.imbue(loc);
// 使⽤标准facet
locale utf8(locale(), new codecvt_utf8_utf16<wchar_t> );
wcout.imbue(utf8);
// 使⽤系统local
locale sys_loc("");
wcout.imbue(sys_loc);
wcout << str << endl;
cout << wcslen(str) << endl;
我们可以使⽤wcslen来计算宽字节字符串的长度,它输出的结果是2,⽽不是6。
C++当中的编码设置是⼀个很⼤的问题,因为在刷题当中⼏乎不会遇到,我们这⾥也只是做⼀个浅尝辄⽌的讨论。⼤家如果有需要,可⾃⾏深⼊研究。
到此这篇关于C++char类型和输⼊输出优化的⽂章就介绍到这了,更多相关C++char类型和输⼊输出优化内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
注:⽂章转⾃:Coder梁(ID:Coder_LT)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论