C 強制型別轉換與字元型別之間的轉換

2021-10-09 07:36:43 字數 4164 閱讀 3491

1、強制型別轉換

在實際工程中幾乎是不可避免的,為此c++將強制型別轉換分為4種不同的型別,以提供更加安全可靠的轉換。

強制型別轉換

說 明static_cast

用於基本型別之間、有繼承關係的類物件之間、類指標之間的轉換

不能用於基本型別指標之間的轉換

const_cast

用於去除變數的唯讀屬性

強制轉換的目標型別必須是指標或引用

reinterpret_cast

用於指標型別之間、整數和指標型別之間的轉換

dynamic_cast

用於有繼承關係的類指標之間、有交叉關係的類指標之間的轉換

具有型別檢查的功能

需要虛函式的支援

c++提供的4種強制型別轉換以關鍵字的方式出現,使用語法為:***_cast(expression)

#include void static_cast_demo()

void const_cast_demo()

void reinterpret_cast_demo()

void dynamic_cast_demo()

int main()

2、字元與數字之間相互轉換 

atoi、atof、atol、atoll等c++11標準函式將字串轉換成int、double、long、long long等

strtol、strtod、strtof、strtoll、strtold 函式將字串轉換成int、double、float、long long、long double等

其中atof函式使用例程如下:

/* atof example: sine calculator */

#include /* printf, fgets */

#include /* atof */

#include /* sin */

int main ()

enter degrees: 45

the sine of 45.000000 degrees is 0.707101

strtol、strtod、strtof、strtoll、strtold 函式使用例程:

long strtol(const char * str,char ** str_end,int base);

long strtol(const char * restrict str,char ** restrict str_end,int base);

long long strtoll(const char * restrict str,char ** restrict str_end,int base);

str指向要解釋的以空字元結尾的位元組字串,str_end指向的指標設定為指向經過最後解釋的字元的字元。

其中引數base的範圍為2~36,和0,它決定了字串以被轉換為整數的權值,可以被轉換的合法字元依據base而定。當base為2時合法字元為『0』,『1』;base為8時合法字元為『0』,『1』,……『7』;base為10時合法字元為『0』,『1』,……『9』;base 為16時合法字元為『0』,『1』,……『9』,『a』,……『f』;base為24時合法字元為『0』,……『9』,『a』,……『n』,base為36時,合法字元為『0』,……『9』,『a』,……『z』。

#include #include int main()

輸出:數字(無符號長整數)是 2030300

字串部分是 | this is test|

float strtof(const char * restrict str,char ** restrict str_end);

double strtod(const char * str,char ** str_end);

double strtod(const char * restrict str,char ** restrict str_end);

long double strtold(const char * restrict str,char ** restrict str_end);

#include #include #include int main(void)

printf("%f\n", f);

}}parsing '111.11 -2.22 nan nan(2) inf 0x1.bc70a3d70a3d7p+6 1.18973e+4932zzz':

'111.11' -> 111.110000

' -2.22' -> -2.220000

' nan' -> nan

' nan(2)' -> nan

' inf' -> inf

' 0x1.bc70a3d70a3d7p+6' -> 111.110000

' 1.18973e+4932' -> range error, got inf

/* strtof example */

#include /* printf, null */

#include /* strtof */

int main ()

輸出:f1 = 686.969971

f1 = 365.239990

one martian year takes 1.88 earth years.

// %.*s 其中的.*表示顯示的精度 對字串輸出(s)型別來說就是寬度

// 這個*代表的值由後面的引數列表中的整數型(int)值給出

// 例如:

printf("%.*s\n", 1, "abc");        // 輸出a

printf("%.*s\n", 2, "abc");        // 輸出ab

printf("%.*s\n", 3, "abc");        // 輸出abc >3是一樣的效果 因為輸出型別type = s,遇到'\0'會結束

3、把數字轉換成字串string,to_string函式

string to_string (int val);

string to_string (long val);

string to_string (long long val);

string to_string (unsigned val);

string to_string (unsigned long val);

string to_string (unsigned long long val);

string to_string (float val);

string to_string (double val);

string to_string (long double val);

#include // std::cout

#include // std::string, std::to_string

int main ()

執行結果:

pi is 3.141593

28 is a perfect number

除了to_string函式外sprintf 最常見的應用之一莫過於把整數列印到字串中,所以spritnf 在大多數場合可以替代itoa例如

//把整數123 列印成乙個字串儲存在s 中。

sprintf(s, "%d", 123); //產生"123"

可以指定寬度,不足的左邊補空格:

sprintf(s, "%8d%8d", 123, 4567); //產生:" 123 4567"

當然也可以左對齊:

sprintf(s, "%-8d%8d", 123, 4567); //產生:"123 4567"

也可以按照16 進製列印:

sprintf(s, "%8x", 4567); //小寫16 進製,寬度佔8 個位置,右對齊

sprintf(s, "%-8x", 4568); //大寫16 進製,寬度佔8 個位置,左對齊

/* sprintf example */

#include int main ()

[5 plus 3 is 8] is a string 13 chars long

C 自動型別轉換與強制型別轉換的講解

自動型別轉換 隱式型別轉換 這些轉換是 c 預設的以安全方式進行的轉換,不會導致資料丟失。例如,從小的整數型別轉換為大的整數型別,從派生類轉換為基類。轉換規則 從儲存範圍小的型別到儲存範圍大的型別。整數具體規則為 byte short char int long float double 也就是說b...

C 強制型別轉換

四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型別轉化最終還是被c 接受了。1.stat...

C 強制型別轉換

標準c 中主要有四種強制轉換型別運算子 const cast,reinterpret cast,static cast,dynamic cast等等。1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast a a的值轉換為模板中...