广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++char类型和输入输出优化
  • 286
分享到

C++char类型和输入输出优化

2024-04-02 19:04:59 286人浏览 薄情痞子
摘要

目录1、char类型2、getchar、putchar、cin.get、cout.put3、输入输出中文1、char类型 char的全称是character,也就是字符的意思。顾名思

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、cin.get、cout.put

getcharputchar都是C语言当中专门面向字符io的函数,也就是读入和输出字符的函数。

因为确定了处理的数据类型是字符,不需要额外的格式说明,因此getcharputchar的效率要比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;
}


cin.getcout.putgetcharputchar的用法类似,只不过是C++当中的特性。大家可以参考一下下面这个例子,就不过多赘述了。


char c;
cin.get(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_tchar的宽类型版本,它占据两个字节。可以用来存储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的优先级最低。

cincout可以看成是针对char的流,所以不适合应用在wchar_t类型的处理上。与之对应我们应该使用wcin和wcout。而wcout默认采用的是C local,并不认识中文,所以我们要先对wcoutlocal进行设置。将其设置成和运行环境的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++char类型和输入输出优化的文章就介绍到这了,更多相关C++char类型和输入输出优化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

注:文章转自微信公众号:Coder梁(ID:Coder_LT)

--结束END--

本文标题: C++char类型和输入输出优化

本文链接: https://www.lsjlt.com/news/156240.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++char类型和输入输出优化
    目录1、char类型2、getchar、putchar、cin.get、cout.put3、输入输出中文1、char类型 char的全称是character,也就是字符的意思。顾名思...
    99+
    2022-11-12
  • C++的输入与输出和格式化输出
    目录一、C++ 输入与输出 格式化输出1.cin与cout2.格式化输出2.1设置域宽及位数2.2按进制输出2.3设置填充符总结一、C++ 输入与输出 格式化输出 1.cin与cou...
    99+
    2022-11-12
  • C++输入输出(cin和cout)
    在C语言中,我们通常会使用 scanf 和 printf 来对数据进行输入输出操作。在C++语言中,C语言的这一套输入输出库我们仍然能使用,但是 C++ 又增加了一套新的、更容易使用的输入输出库。【例1】简单的输入输出代码示例:#inclu...
    99+
    2023-06-03
  • C#文档输出的类型
    这篇文章主要讲解了“C#文档输出的类型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#文档输出的类型”吧!常见C#文档输出的类型描述符及介绍:◆N:Namespace◆T:类型:class...
    99+
    2023-06-17
  • C++ stringstream格式化输出输入分析
    这篇文章主要讲解了“C++ stringstream格式化输出输入分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++ stringstream格式化输出输入分析”吧!目录最近在笔试时经...
    99+
    2023-06-25
  • C++ stringstream格式化输出输入详情
    目录最近在笔试时经常遇见各种输入问题,于是细心总结一波;首先string str; cin>>str;遇到空格结束;于是乎产生了getline(),可与得到一行字符串;空...
    99+
    2022-11-12
  • C++的输入和输出流详解
    目录输入和输出流标准输入流小案例标准输出流文件读写总结输入和输出流 从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。 从磁盘文件输入数据,数据输出到...
    99+
    2022-11-13
  • 基本数据类型、输入输出、运算符
    #:单行注释 “”“ ”“”:多行注释 为什么数据要区分类型? 数据类型值是变量值的类型,变量值之所以区分类型,是因为变量值是用来记录事物状态的,而事物的状态有不同的种类,对应着,也必须使用不同类型的值去记录它们。 有哪些数据类型...
    99+
    2023-01-31
    数据类型 输入输出 运算符
  • C++输入流和输出流 超级详细
    目录1、简单介绍2、C++输入流和输出流1、简单介绍 C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语...
    99+
    2022-11-12
  • C++输入和输出流的示例分析
    这篇文章给大家分享的是有关C++输入和输出流的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。输入和输出流从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。从磁盘文件输入数据...
    99+
    2023-06-29
  • 【C++入门系列】——命名空间和输入输出
    ​作者主页 📚lovewold少个r博客主页    ⚠️本文重点:c++入门第一个程序和基本知识讲解 😄每日一言:忙,不会死,人只有越忙越活,流水不腐,户枢不蠹。 目录 ​作者主页 前言 谈谈...
    99+
    2023-10-18
    c++
  • c语言如何输入string类型
    在C语言中,可以使用char数组来表示字符串。可以使用scanf函数来输入字符串。```c#include int main() {...
    99+
    2023-09-12
    c语言
  • C++之IO类,文件输入输出,string流练习题
    目录前面已经在用的IO库设施IO类IO对象不能拷贝或赋值条件状态管理输出缓冲文件输入输出fstream特有的操作文件模式string流stringstream特有的操作练习练习1练习...
    99+
    2022-11-12
  • Java中常用数据类型的输入输出详解
    目录1、Char型1.1  输入格式:1.2  举例说明2、int型1.1  简单的int格式输入:1.2  举例说明2.1带空格的int格式输入 :2.2  举例说明3.1  复杂...
    99+
    2022-11-12
  • Java常用数据类型的输入输出有哪些
    这篇文章主要介绍Java常用数据类型的输入输出有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、Char型这里说的char型指的是只输入一个字符的情况。 1.1  输入格式:import java.i...
    99+
    2023-06-29
  • python 3 用户输入和格式化输出
    # -*- coding:utf-8 -*- #用户输入 && 格式化输出 #getpass 模块是内置的,可以将输入的内容隐藏 import getpass username = input("username:") pa...
    99+
    2023-01-31
    用户 python
  • Java中关于char类型变量能够输出中文的问题
    目录前言一、char类型二、代码附表:Unicode字符列表总结前言 我印象中char变量不能输出为中文,今天敲代码发现char变量虽然不能直接存中文,但是可以输出,理解错误,记录一...
    99+
    2022-12-26
    Java char类型 char类型变量 char类型变量输出中文
  • 一起来学习C语言的输入和输出
    目录一、scanf() 和 printf() 函数实例二、getchar() 和 putchar() 函数实例1实例2三、gets() 和 puts() 函数实例...
    99+
    2022-11-13
  • C语言怎么实现数据输入和输出
    本文小编为大家详细介绍“C语言怎么实现数据输入和输出”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现数据输入和输出”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。语句C语言的语句用来向计算机系统发出操...
    99+
    2023-07-02
  • Java中常用数据类型的输入输出方法是什么
    这篇文章主要介绍Java中常用数据类型的输入输出方法是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、Char型这里说的char型指的是只输入一个字符的情况。1.1  输入格式:import ...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作