C 中char和int轉換

2021-08-20 08:04:24 字數 3772 閱讀 2481

1 整數轉化字串  sprintf

在標頭檔案 #include中

語法: int sprintf(string format, mixed [args]...);

返回值:字串長度(strlen)

轉換字元

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

%% 印出百分比符號,不轉換。

%c 整數轉成對應的 ascii 字元。

%d 整數轉成十進位。

%f 倍精確度數字轉成浮點數。

%o 整數轉成八進位。

%s 整數轉成字串。

%x 整數轉成小寫十六進製。

%x 整數轉成大寫十六進製。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

<?

$money = 123.1

$formatted = sprintf ("%06.2f", $money); // 此時變數 $ formatted 值為 "123.10"

$formatted = sprintf ("%08.2f", $money); // 此時變數 $ formatted 值為 "00123.10"

$formatted = sprintf ("%-08.2f", $money); // 此時變數 $ formatted 值為 "123.1000"

$formatted = sprintf ("%.2f%%", 0.95 * 100); // 格式化為百分比

?>

¢%08.2f 解釋:

%開始符

0是 "填空字元" 表示,如果長度不足時就用0來填滿。

8格式化後總長度

2f小數字長度,即2位

¢第3行值為"00123.10" 解釋:

因為2f是(2位)+小數點符號(1)+前面123(3位)=6位,總長度為8位,故前面用[填空字元]0表示,即00123.10

¢第4行值為"123.1000" 解釋:

-號為反向操作,然後填空字元0新增在最後面了

格式化數字字串

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 個位置,左對齊

這樣,乙個整數的16 進製字串就很容易得到,但我們在列印16 進製內容時,通常想要一種左邊補0 的等寬格式,那該怎麼做呢?

很簡單,在表示寬度的數字前面加個0 就可以了。

sprintf(s, "%08x", 4567); //產生:"000011d7"

上面以」%d」進行的10 進製列印同樣也可以使用這種左邊補0 的方式。

這裡要注意乙個符號擴充套件的問題:比如,假如我們想列印短整數(short)-1 的記憶體16 進製表示形式,在win32 平台上,

乙個short 型佔2 個位元組,所以我們自然希望用4 個16 進製數字來列印它:

short si = -1;

sprintf(s, "%04x", si);

產生「ffffffff」,怎麼回事?因為spritnf 是個變參函式,除了前面兩個引數之外,後面的引數都不是型別安全的,

函式更沒有辦法僅僅通過乙個「%x」就能得知當初函式呼叫前引數壓棧時被壓進來的到底是個4 位元組的整數還是個2 位元組的短整數,

所以採取了統一4 位元組的處理方式,導致引數壓棧時做了符號擴充套件,擴充套件成了32 位的整數-1,列印時4 個位置不夠了,

就把32 位整數-1 的8 位16 進製都列印出來了。

如果你想看si 的本來面目,那麼就應該讓編譯器做0 擴充套件而不是符號擴充套件(擴充套件時二進位制左邊補0 而不是補符號位):

sprintf(s, "%04x", (unsigned short)si);

就可以了。或者:

unsigned short si = -1;

sprintf(s, "%04x", si);

sprintf 和printf 還可以按8 進製列印整數字串,使用」%o」。注意8 進製和16 進製都不會打

印出負數,都是無符號的,實際上也就是變數的內部編碼的直接的16 進製或8 進製表示。

控制浮點數列印格式

浮點數的列印和格式控制是sprintf 的又一大常用功能,浮點數使用格式符」%f」控制,預設保

留小數點後6 位數字,比如:

sprintf(s, "%f", 3.1415926); //產生"3.141593"

但有時我們希望自己控制列印的寬度和小數字數,這時就應該使用:」%m.nf」格式,其中m 表

示列印的寬度,n 表示小數點後的位數。比如:

sprintf(s, "%10.3f", 3.1415626); //產生:" 3.142"

sprintf(s, "%-10.3f", 3.1415626); //產生:"3.142 "

sprintf(s, "%.3f", 3.1415626); //不指定總寬度,產生:"3.142"

注意乙個問題,你猜

int i = 100;

sprintf(s, "%.2f", i);

會打出什麼東東來?「100.00」?對嗎?自己試試就知道了,同時也試試下面這個:

sprintf(s, "%.2f", (double)i);

第乙個打出來的肯定不是正確結果,原因跟前面提到的一樣,引數壓棧時呼叫者並不知道跟i相對應的格式控制符是個」%f」。

而函式執行時函式本身則並不知道當年被壓入棧裡的是個整數,於是可憐的儲存整數i 的那4 個位元組就被不由分說地強行作為

浮點數格式來解釋了,整個亂套了。不過,如果有人有興趣使用手工編碼乙個浮點數,

那麼倒可以使用這種方法來檢驗一下你手工編排的結果是否正確。

2 字串轉成整數:  atoi和atol。這是c的標準庫。 

c語言庫函式名: atoi

功 能: 把字串轉換成整型數.

原型: int atoi(const char *nptr);

函式說明: 引數nptr字串,如果第乙個非空格字元不存在或者不是數字也不是正負號則返回零,否則開始做型別轉換,

之後檢測到非數字或結束符 /0 時停止轉換,返回整型數。

標頭檔案: #include

程式例:

1)#include

#include

int main(void)

執行結果

string = 12345.67 integer = 12345

2)#include

#include

int main()

執行結果

c = 23

簡單的實現atoi函式源**:

int my_atoi(const char *str)

}else return 0;

/* 開始轉換 */

while(*str>='0'&&*str<='9')

result = result*10+(*str++ -'0');

return signal*result;

}

c 中int轉換為char 型別

在學習c opencv時,想讀取有規律的一些影象,影象名時有規律的數字,要用到int 轉char 型別,可以寫 但是為了方便和整潔打算用c 自帶的函式寫成。在轉換時要用char 類的,因為在這裡我們不能初始化char 所以要分配一塊記憶體空間。include int i 0 char itc 10 ...

C 中int與char相互轉換

了解int與char相互轉換之前,先讓我們看一下ascii碼表。其中數字字元對應的位置為 48 57。char轉int之前,先將表示式中的每個字元都轉換成ascii碼值,再進行計算。以下 為例,其中i3的結果符合我們的預期要求。char c 0 int i1 c 48 int i2 c 0 48 i...

c 中的int與char之間轉換問題

在平時的acm中很容易見到資料型別需要在數字和字元之間轉換的問題,我以乙個簡單的程式設計題來說一下這個問題。讀入乙個正整數 n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。每個測試輸入包含 1 個測試用例,即給出自然數 n 的值。這裡保證 n 小於 10 100 在一行內輸出 n 的各位數字之...