激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++char類型和輸入輸出優化

C++char類型和輸入輸出優化

2022-02-19 16:06Coder_LT C/C++

這篇文章主要介紹了C++char類型和輸入輸出優化,char的全稱是character,也就是字符的意思。顧名思義,char類型是專門為了存儲字符而設計的。下面我們一起來看看文章的具體內容吧

 

1、char類型

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

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

char一共有8個二進制位,即一個字節,理論上能夠存儲256個字符。基本上足夠涵蓋計算機當中所有的字母、標點符號以及數字,即ASCII碼。

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

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

C++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;


C++char類型和輸入輸出優化

只是為什么最后輸出的長度是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命令,就可查看當前系統使用的語言環境。

C++char類型和輸入輸出優化

locale的結果包含12類,我在網上也找到了表格:

C++char類型和輸入輸出優化

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)

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 中文字幕亚洲欧美 | 日韩视频精品一区 | 7777视频| 国产一级性生活视频 | av色先锋| 成人福利免费在线观看 | 欧美jizzhd极品欧美 | www日韩大片 | 羞羞视频.www在线观看 | 极品国产91在线网站 | 久久人人爽人人爽人人片av高清 | 国产精品手机在线亚洲 | 成人黄色小视频网站 | 精品国产一区二区三区在线观看 | 国产成人高清成人av片在线看 | 中文字幕在线视频日本 | av影院在线 | 久久精品无码一区二区三区 | 91视频成人入口 | 欧美性色大片 | 久久九九热re6这里有精品 | 久久国产精品久久久久久电车 | 91久久99热青草国产 | 成人免费精品视频 | 欧美片a | 97se亚洲综合在线韩国专区福利 | 999精品国产 | 免费一级在线视频 | 久久狂草 | 免费看成年人视频在线 | 一区二区三区四区国产精品视频 | 国产精品久久久久久模特 | 日操操夜操操 | 国产精品成人久久久久a级 男女无遮挡羞羞视频 | 欧产日产国产精品乱噜噜 | 国产亚洲精久久久久久蜜臀 | 亚洲av一级毛片特黄大片 | 国产精品久久久久久婷婷天堂 | 国产免费一区二区三区网站免费 | 成人免费观看毛片 | 免费一级在线视频 |