欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1、char類型

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

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

char一共有8個二進制位,即一個字節(jié),理論上能夠存儲256個字符?;旧献銐蚝w計算機當中所有的字母、標點符號以及數(shù)字,即ASCII碼。

ASCII的全稱是美國信息交換標準代碼,它是一套電腦編碼系統(tǒng),包含了所有英文字母以及標點符號和一些特殊字符。全表一共有128個字符,剛好可以用一個char(有符號)來存儲。

大家可以參考一下下表,Dec表示編號,Char表示字符。

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

當我們把一個字符賦值給char型變量的時候,它會去查ASCII表,找到字符對應(yīng)的編號。同樣,當我們使用%c輸出一個字符的時候,它也會去尋找char中存儲的編碼對應(yīng)的符號進行輸出。

既然字符在C++當中都是以數(shù)字的形式存儲的,那么我們就可以對它來進行加減運算。

比如:

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


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

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


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

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

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


這樣我們得到的num就是數(shù)字型的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的函數(shù),也就是讀入和輸出字符的函數(shù)。

因為確定了處理的數(shù)據(jù)類型是字符,不需要額外的格式說明,因此getcharputchar的效率要比scanf和printf更高。

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

我這里貼一段使用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、輸入輸出中文

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

其實直接在C++當中是可以直接輸出中文的,這并不會有什么問題。

比如下列代碼,是可以完美運行的:

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


只是為什么最后輸出的長度是6?因為我是在Mac上跑的這段代碼。在Mac當中默認使用utf-8編碼,一個漢字的長度是3個字節(jié)。C++當中的字符串計算長度的時候統(tǒng)計的是字節(jié)的數(shù)量,所以兩個漢字的長度是6。

如果我們是在源代碼當中寫入了中文,比如:

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


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

解決方案是我們可以使用wchar_t,wchar_tchar的寬類型版本,它占據(jù)兩個字節(jié)??梢杂脕泶鎯?code>unicode編碼的字符:

const wchar_t* str = L"中文";


我們在中文兩個字之前加上了L修飾符,它告訴編譯器,這是一個寬字符,我們需要編譯器根據(jù)locale來進行翻譯。

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

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

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

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

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

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

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

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

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

// 使用標準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來計算寬字節(jié)字符串的長度,它輸出的結(jié)果是2,而不是6。

C++當中的編碼設(shè)置是一個很大的問題,因為在刷題當中幾乎不會遇到,我們這里也只是做一個淺嘗輒止的討論。大家如果有需要,可自行深入研究。

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

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

相關(guān)文章

  • sqlserver,sqlite,access數(shù)據(jù)庫鏈接字符串整理

    sqlserver,sqlite,access數(shù)據(jù)庫鏈接字符串整理

    本節(jié)主要整理sqlserver,sqlite,access數(shù)據(jù)庫鏈接字符串,有需要的朋友可以參考下
    2014-07-07
  • VScode搭建C/C++開發(fā)環(huán)境的詳細過程

    VScode搭建C/C++開發(fā)環(huán)境的詳細過程

    最近迷上了vscode,小巧美觀,最主要的是全平臺,但是vscode并不是ide,必須得自己配置環(huán)境,下面這篇文章主要給大家介紹了關(guān)于VScode搭建C/C++開發(fā)環(huán)境的詳細過程,需要的朋友可以參考下
    2023-06-06
  • Cocos2d-x UI開發(fā)之CCControlButton控件類實例

    Cocos2d-x UI開發(fā)之CCControlButton控件類實例

    這篇文章主要介紹了Cocos2d-x UI開發(fā)之CCControlButton控件類實例,本文代碼中包含大量注釋來講解CCControlButton控件類的使用,需要的朋友可以參考下
    2014-09-09
  • C語言超詳細講解數(shù)據(jù)結(jié)構(gòu)中雙向帶頭循環(huán)鏈表

    C語言超詳細講解數(shù)據(jù)結(jié)構(gòu)中雙向帶頭循環(huán)鏈表

    帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復雜,一般用在單獨存儲數(shù)據(jù)。實際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個結(jié)構(gòu)雖然結(jié)構(gòu)復雜,但是使用代碼實現(xiàn)以后會發(fā)現(xiàn)結(jié)構(gòu)會帶來很多優(yōu)勢,實現(xiàn)反而簡單
    2022-04-04
  • C語言制作貪吃蛇小游戲

    C語言制作貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了C語言制作貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Visual Studio Code上添加小程序自動補全插件的操作方法

    Visual Studio Code上添加小程序自動補全插件的操作方法

    這篇文章主要介紹了Visual Studio Code上添加小程序自動補全插件的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Matlab實現(xiàn)繪制立體玫瑰花的示例代碼

    Matlab實現(xiàn)繪制立體玫瑰花的示例代碼

    這篇文章主要介紹了如何利用Matlab實現(xiàn)繪制更立體的玫瑰花,文中的示例代碼講解詳細,對我們學習Matlab有一定的幫助,需要的可以參考一下
    2023-02-02
  • c++實現(xiàn)簡單的線程池

    c++實現(xiàn)簡單的線程池

    這里給大家介紹了C++中對于pthread線程的一個簡單應(yīng)用以及使用繼承CDoit,實現(xiàn)其中的start和end,有需要的小伙伴可以參考下
    2015-11-11
  • C語言實現(xiàn)冒泡排序的思路以及過程

    C語言實現(xiàn)冒泡排序的思路以及過程

    冒泡排序是最簡單的排序方法,理解起來容易。雖然它的計算步驟比較多,不是最快的,但它是最基本的,初學者一定要掌握。本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值
    2021-09-09
  • C語言實現(xiàn)輸入兩個數(shù)字將其按從小到大輸出的方法

    C語言實現(xiàn)輸入兩個數(shù)字將其按從小到大輸出的方法

    這篇文章主要介紹了C語言實現(xiàn)輸入兩個數(shù)字將其按從小到大輸出的方法,本文通過代碼講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04

最新評論