首页天道酬勤int转char(charm是什么意思)

int转char(charm是什么意思)

admin 12-02 02:51 315次浏览

大家好,我是外向的火龙果。

今天是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(第六版)

分布式版Redis架构 云内存 UMem RedisJava_StringIndexOutOfBoundsException异常找不到所需的文件。名称:index.html与dockercompose反应Vue cli及Vue router怎么搭建eclipse怎么打jar包短信群发平台怎么正确做到的短信群发呢?
linux卸载内核模块命令(调用linux内核模块的函数) c语言常见错误列表(c语言遇到的问题)
相关内容