簡體   English   中英

char變量是否總是用{'x',\\ 0}表示為已取消引用的char * [2]?

[英]Is char variable always represented as dereferenced char*[2] with {'x',\0}?

我試過這種方法將一個char位數轉換為一個整數('3'-> 3),它似乎起作用。

char c='x';
int i=atoi(&c);

我的問題是,這將始終有效嗎?

在第一個字符之后是否總是有NULL字符?

還有另一種使用隱式類型轉換的方法,但是我不確定這是一個好習慣。 實際上,我非常驚訝,即使使用-Wall和-Wextra也沒有警告。

int i = c - '0';

注意我正在使用GCC 4.8.2和MinGW。

這可以編譯,但是它是未定義的行為。

char只是一個字符。 之后沒有空字節。 std::atoi期望為空字節,因此調用std::atoi(&c)編譯,但會產生未定義的行為。 這條線

int i = std::atoi("x");

但是,由於字符串"x"char[2]且以null終止,因此定義明確。

int i = c - '0';

沒問題,因為1 C ++ 11標准C99標准 2保證了字符數字的順序。


1就像@ShafikYaghmour在對您的問題的評論中指出的那樣

2再次感謝@ShafikYaghmour!

atoi期望null終止的C字符串。

由於未提供(您提供了指向字符的指針),因此這是未定義的行為。

對於第二行代碼-如果可以保證字符確實是數字,通常可以使用。 例如,字符#將產生結果,但可能不會產生您期望的結果。

一些解決方案是使用std::stoi

try{ int x = std::stoi(std::string() + c) } catch(...) {/*handle*/}

只要在分配c的內存空間旁邊為\\ 0,它就可以工作。 換句話說,這只是運氣。 您應該使用int i = c - '0'

但是請注意,每個字符都將映射到int(fe int i = 'a' - '0'

為了避免這種情況,您可以執行以下操作:

int i = c=>'0' && c<='9' ? c-'0' : -1; //-1 represents not valid values

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM