int转char(charm是什么意思)
大家好,我是外向的火龙果。
今天是EasyC项目的第六部分,char类型和输入输出加速。
参观github仓库:EasyLeetCode,欢迎明星,欢迎pr~
char类型
char的全称是character,意思是character。甜红葡萄酒,炭型是专门为存储字符而设计的。电脑存储数字非常方便,只要把数字转换成二进制就可以了。然而,存储字符有点麻烦,通常是通过数字编码字符。这就是为什么char type本质上是另一个整数,因为它实际上存储了字符的数字编码。
Char有八个二进制位,也就是一个字节,理论上可以存储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 ';
我们用这种方法得到的数是数字1。
例如,我们也可以通过符号大于或小于来判断字符类型的范围:
char c=' 1
if(c=' 0 ' c=' 9 '){ 0
cout 'c是数字' endl
}
getchar、putchar、cin.get、cout.put
getchar和putchar是C语言专门面向字符IO的功能,即读取和输出字符的功能。因为确定要处理的数据类型是字符,不需要额外的格式描述,所以getchar和putchar的效率高于scanf和printf。
所以在算法竞争领域,为了提高程序的性能,有人疯狂地用getchar代替scanf读取数据。
在这里,我发布了一段使用getchar读入int类型的代码,供大家参考。这是一种标准的外来技术,不推荐使用。
void read(int x){ 0
int f=1;x=0;char s=getchar();
while(s“0”| | s“9”){ 0
if(s=='-'){ 0
f=-1;
s=getchar();
}
}
while(s=' 0 ' s=' 9 '){ 0
x=x * 10s-' 0 ';
s=getchar();
}
x *=f;
}
Cin.get和cout.put在用法上与getchar和putchar类似,只是c语言中的特性,可以参考下面的例子,但不做详细介绍。
char c;
CIN . get(c);
cout . put(c);
输入输出中文
我犹豫了很久是不是要加这一段,因为真的没有相关经验,毕竟我之前只刷过题。经过长时间的奋斗,我决定把它写下来,因为这个问题对于很多同学来说应该是非常重要的,尤其是那些想做C项目的同学。我的水平有限,我已经设法整理了所有的信息。如有错误,请指出~其实直接用C语言输出中文是可以的,不会有问题。
例如,以下代码可以完美运行:
字符串字符串;
cin海峡;
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"); 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语言的国际化
C++ Primer(第六版)
快三邀请码稳赚计划char_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"); 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语言的国际化
C++ Primer(第六版)