最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++char類型和輸入輸出優(yōu)化

 更新時(shí)間:2021年11月03日 10:44:19   作者:Coder_LT  
這篇文章主要介紹了C++char類型和輸入輸出優(yōu)化,char的全稱是character,也就是字符的意思。顧名思義,char類型是專門為了存儲(chǔ)字符而設(shè)計(jì)的。下面我們一起來(lái)看看文章的具體內(nèi)容吧

1、char類型

char的全稱是character,也就是字符的意思。顧名思義,char類型是專門為了存儲(chǔ)字符而設(shè)計(jì)的。

計(jì)算機(jī)存儲(chǔ)數(shù)字非常方便,只需要將其轉(zhuǎn)化成二進(jìn)制即可。但存儲(chǔ)字符就有點(diǎn)麻煩了,一般都是通過(guò)對(duì)字符進(jìn)行數(shù)字化編碼。這也就是為什么char類型本質(zhì)上是另外一種整數(shù),因?yàn)樗鎯?chǔ)的其實(shí)是字符的數(shù)字編碼。

char一共有8個(gè)二進(jìn)制位,即一個(gè)字節(jié),理論上能夠存儲(chǔ)256個(gè)字符?;旧献銐蚝w計(jì)算機(jī)當(dāng)中所有的字母、標(biāo)點(diǎn)符號(hào)以及數(shù)字,即ASCII碼。

ASCII的全稱是美國(guó)信息交換標(biāo)準(zhǔn)代碼,它是一套電腦編碼系統(tǒng),包含了所有英文字母以及標(biāo)點(diǎn)符號(hào)和一些特殊字符。全表一共有128個(gè)字符,剛好可以用一個(gè)char(有符號(hào))來(lái)存儲(chǔ)。

大家可以參考一下下表,Dec表示編號(hào),Char表示字符。

其中數(shù)字0的編號(hào)是48,字母a的編號(hào)是97,大寫字母A的標(biāo)號(hào)是65。

當(dāng)我們把一個(gè)字符賦值給char型變量的時(shí)候,它會(huì)去查ASCII表,找到字符對(duì)應(yīng)的編號(hào)。同樣,當(dāng)我們使用%c輸出一個(gè)字符的時(shí)候,它也會(huì)去尋找char中存儲(chǔ)的編碼對(duì)應(yīng)的符號(hào)進(jìn)行輸出。

既然字符在C++當(dāng)中都是以數(shù)字的形式存儲(chǔ)的,那么我們就可以對(duì)它來(lái)進(jìn)行加減運(yùn)算。

比如:

char c = 'a';
cout << ++c << endl;


得到的結(jié)果是'b',有加自然也有減,我們也可以對(duì)它做減法操作。

char c = 'b';
cout << --b << endl;


得到的結(jié)果就是'a'。

另外,我們還可以對(duì)于兩個(gè)char類型的變量進(jìn)行減法操作。比如用得比較多的就是將字符型的數(shù)字轉(zhuǎn)成int型。

char c = '1';
int num = c - '0';


這樣我們得到的num就是數(shù)字型的1。

再比如,我們還可以通過(guò)大于小于符號(hào)來(lái)判斷char類型的范圍:

char c = '1';
if (c >= '0' && c <= '9') {
    cout << "c is a number" << endl;
}

2、getchar、putchar、cin.get、cout.put

getcharputchar都是C語(yǔ)言當(dāng)中專門面向字符IO的函數(shù),也就是讀入和輸出字符的函數(shù)。

因?yàn)榇_定了處理的數(shù)據(jù)類型是字符,不需要額外的格式說(shuō)明,因此getcharputchar的效率要比scanf和printf更高。

所以在算法競(jìng)賽領(lǐng)域,有人為了提升程序的性能,喪心病狂地使用getchar代替scanf來(lái)讀入數(shù)據(jù)。

我這里貼一段使用getchar來(lái)讀入int型的代碼,給大家做一個(gè)參考。這個(gè)屬于標(biāo)準(zhǔn)的奇淫技巧,不推薦使用。

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的用法類似,只不過(guò)是C++當(dāng)中的特性。大家可以參考一下下面這個(gè)例子,就不過(guò)多贅述了。

char c;
cin.get(c);
cout.put(c);

3、輸入輸出中文

關(guān)于這一段我猶豫了很久要不要加,因?yàn)閷?shí)在是沒(méi)有相關(guān)經(jīng)驗(yàn),畢竟之前只刷題了。糾結(jié)了很久還是決定寫上,因?yàn)檫@個(gè)問(wèn)題對(duì)于不少同學(xué)應(yīng)該挺重要的,尤其是想要做C++工程的同學(xué)。本人水平有限,勉強(qiáng)整理了一下各方資料,如有錯(cuò)誤,歡迎指出~

其實(shí)直接在C++當(dāng)中是可以直接輸出中文的,這并不會(huì)有什么問(wèn)題。

比如下列代碼,是可以完美運(yùn)行的:

string str;
cin >> str;
cout << str << endl;
cout << str.length() << endl;


只是為什么最后輸出的長(zhǎng)度是6?因?yàn)槲沂窃?code>Mac上跑的這段代碼。在Mac當(dāng)中默認(rèn)使用utf-8編碼,一個(gè)漢字的長(zhǎng)度是3個(gè)字節(jié)。C++當(dāng)中的字符串計(jì)算長(zhǎng)度的時(shí)候統(tǒng)計(jì)的是字節(jié)的數(shù)量,所以兩個(gè)漢字的長(zhǎng)度是6。

如果我們是在源代碼當(dāng)中寫入了中文,比如:

string str = "中文";
cout << str << endl;


這就可能一些問(wèn)題,最常見(jiàn)的問(wèn)題就是代碼存儲(chǔ)環(huán)境和運(yùn)行環(huán)境的默認(rèn)編碼不同,比如IDE當(dāng)中默認(rèn)是utf-8編碼,但是終端默認(rèn)是gbk編碼(windows系統(tǒng)常見(jiàn))。這就會(huì)導(dǎo)致輸出的結(jié)果是亂碼。

解決方案是我們可以使用wchar_t,wchar_tchar的寬類型版本,它占據(jù)兩個(gè)字節(jié)??梢杂脕?lái)存儲(chǔ)unicode編碼的字符:

const wchar_t* str = L"中文";


我們?cè)谥形膬蓚€(gè)字之前加上了L修飾符,它告訴編譯器,這是一個(gè)寬字符,我們需要編譯器根據(jù)locale來(lái)進(jìn)行翻譯。

locale是指根據(jù)計(jì)算機(jī)用戶使用的語(yǔ)言、所在的國(guó)家或地區(qū)以及文化傳統(tǒng)而定義的軟件運(yùn)行時(shí)的語(yǔ)言環(huán)境??梢詫?code>locale理解為一系列環(huán)境變量。locale環(huán)境變量值的格式為language_area.charset。languag表示語(yǔ)言,例如英語(yǔ)或中文;area表示使用該語(yǔ)言的地區(qū),例如美國(guó)或者中國(guó)大陸;charset表示字符集編碼,例如UTF-8或者GBK。

這些環(huán)境變量會(huì)對(duì)日期格式,數(shù)字格式,貨幣格式,字符處理等多個(gè)方面產(chǎn)生影響。在Linux系統(tǒng)下打開(kāi)Terminal,輸入locale命令,就可查看當(dāng)前系統(tǒng)使用的語(yǔ)言環(huán)境。

locale的結(jié)果包含12類,我在網(wǎng)上也找到了表格:

LANG指的是未設(shè)置的默認(rèn)值,大部分程序應(yīng)用LANGUAGE指定的語(yǔ)言作為界面語(yǔ)言。LC_ALL同時(shí)設(shè)置所有的內(nèi)容,并且其優(yōu)先級(jí)比每個(gè)內(nèi)容單獨(dú)設(shè)置的優(yōu)先級(jí)都高,而LANG的優(yōu)先級(jí)最低。

cincout可以看成是針對(duì)char的流,所以不適合應(yīng)用在wchar_t類型的處理上。與之對(duì)應(yīng)我們應(yīng)該使用wcin和wcout。而wcout默認(rèn)采用的是C local,并不認(rèn)識(shí)中文,所以我們要先對(duì)wcoutlocal進(jìn)行設(shè)置。將其設(shè)置成和運(yùn)行環(huán)境的local一致。

大約有以下幾種設(shè)置方法:

#include <codecvt>
const wchar_t* str = L"中文";

// 使用默認(rèn)local
locale loc("");
wcout.imbue(loc);

// 使用local命令顯示的結(jié)果
locale loc("en_US.UTF-8");
wcout.imbue(loc);

// 使用標(biāo)準(zhǔn)facet
locale utf8(locale(), new codecvt_utf8_utf16<wchar_t> );
wcout.imbue(utf8);

// 使用系統(tǒng)local
locale sys_loc("");
wcout.imbue(sys_loc);

wcout << str << endl;
cout << wcslen(str) << endl;

我們可以使用wcslen來(lái)計(jì)算寬字節(jié)字符串的長(zhǎng)度,它輸出的結(jié)果是2,而不是6。

C++當(dāng)中的編碼設(shè)置是一個(gè)很大的問(wèn)題,因?yàn)樵谒㈩}當(dāng)中幾乎不會(huì)遇到,我們這里也只是做一個(gè)淺嘗輒止的討論。大家如果有需要,可自行深入研究。

到此這篇關(guān)于C++char類型和輸入輸出優(yōu)化的文章就介紹到這了,更多相關(guān)C++char類型和輸入輸出優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

注:文章轉(zhuǎn)自微信眾號(hào):Coder梁(ID:Coder_LT)

相關(guān)文章

  • Qt(C++)調(diào)用工業(yè)相機(jī)Basler的SDK使用示例

    Qt(C++)調(diào)用工業(yè)相機(jī)Basler的SDK使用示例

    這篇文章主要介紹了Qt(C++)調(diào)用工業(yè)相機(jī)Basler的SDK使用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Qt實(shí)現(xiàn)QLineEdit輸入前提示輸入范圍并用正則表達(dá)式限制輸入范圍

    Qt實(shí)現(xiàn)QLineEdit輸入前提示輸入范圍并用正則表達(dá)式限制輸入范圍

    在日常開(kāi)發(fā)過(guò)程中QLineEdit作為輸入框,有時(shí)要限制輸入的內(nèi)容,這篇文章主要給大家介紹了關(guān)于Qt實(shí)現(xiàn)QLineEdit輸入前提示輸入范圍并用正則表達(dá)式限制輸入范圍的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • C語(yǔ)言判斷大小端的兩種方法

    C語(yǔ)言判斷大小端的兩種方法

    大小端的問(wèn)題在很多面試筆試中都會(huì)遇到,本文主要介紹了C語(yǔ)言判斷大小端的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • 貪吃蛇游戲C++命令行版實(shí)例代碼

    貪吃蛇游戲C++命令行版實(shí)例代碼

    這篇文章主要介紹了貪吃蛇游戲C++命令行版實(shí)例代碼,包含了常見(jiàn)的循環(huán)語(yǔ)句及相關(guān)游戲規(guī)則的判定方法,有助于更好的理解游戲設(shè)計(jì)原理,需要的朋友可以參考下
    2014-09-09
  • C語(yǔ)言實(shí)現(xiàn)騎士飛行棋小游戲

    C語(yǔ)言實(shí)現(xiàn)騎士飛行棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)騎士飛行棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++11系列學(xué)習(xí)之列表初始化

    C++11系列學(xué)習(xí)之列表初始化

    這篇文章主要介紹了C++11系列學(xué)習(xí)之列表初始化,標(biāo)準(zhǔn)初始化方式太過(guò)繁雜,限制偏多,因此在新標(biāo)準(zhǔn)中統(tǒng)一了初始化方,為了讓初始化具有確定的效果,于是提出了列表初始化概念,下文我們就一起來(lái)學(xué)習(xí)該詳細(xì)內(nèi)容介紹吧
    2022-04-04
  • C++ 讀文件 將文件內(nèi)容讀入到字符串string中的方法

    C++ 讀文件 將文件內(nèi)容讀入到字符串string中的方法

    今天小編就為大家分享一篇C++ 讀文件 將文件內(nèi)容讀入到字符串string中的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程

    Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程

    Microsoft Visual Studio 2022是Microsoft Visual Studio軟件的一個(gè)高版本,能夠編寫和執(zhí)行C/C++代碼,具有強(qiáng)大的功能,是開(kāi)發(fā)C/C++程序的主流軟件,這篇文章主要介紹了Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程
    2024-01-01
  • 利用Matlab實(shí)現(xiàn)陰影柱狀圖的繪制

    利用Matlab實(shí)現(xiàn)陰影柱狀圖的繪制

    陰影柱狀圖繪制的代碼MATHWORKS上也有,不過(guò)是生成圖片后,識(shí)別圖像上不同顏色塊并直接修改像素生成陰影線。這樣的生成方式不可逆且自由度較低,所以本文為大家?guī)?lái)的是一個(gè)直接畫線條填充的硬畫版本,希望有所幫助
    2022-09-09
  • c語(yǔ)言如何實(shí)現(xiàn)DES加密解密

    c語(yǔ)言如何實(shí)現(xiàn)DES加密解密

    這篇文章主要介紹了c語(yǔ)言如何實(shí)現(xiàn)DES加密解密問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評(píng)論

遂昌县| 陆河县| 阆中市| 永济市| 车致| 鄯善县| 嘉峪关市| 抚宁县| 湘潭县| 海城市| 炉霍县| 南京市| 奉化市| 湟源县| 通许县| 绵竹市| 苗栗市| 茌平县| 申扎县| 尤溪县| 罗山县| 河池市| 称多县| 安达市| 龙口市| 皋兰县| 怀仁县| 十堰市| 松溪县| 德州市| 将乐县| 青浦区| 曲阳县| 宣武区| 大洼县| 车致| 斗六市| 金昌市| 赫章县| 六枝特区| 寿阳县|