Re: [問題] 進位轉換 與 ASCII問題
※ 引述《paulyanzi (消失)》之銘言:
: 1.
: 日前看過一個 16 進位轉 10 進位的方式
: 但是不太理解為什麼這樣可以
: 不知道有人可以幫忙解釋嗎?
: num = 16 * num + (*str) - '0';
: str++;
以字串 "345"(10進位)為例子, 以下用圖解說明, 一開始 num初始
值為 0 :
Round 1.
str
↓
'3' '4' '5' '\0'
num = 10 * 0 + ('3'- '0'); // 這時 num == 3
str++; // 這時 str 指到字元 '4'
Round 2.
str
↓
'3' '4' '5' '\0'
num = 10 * 3 + ('4'- '0'); // 這時 num == 34
str++; // 這時 str 指到字元 '5'
Round 3.
str
↓
'3' '4' '5' '\0'
num = 10 * 34 + ('5'- '0'); // 這時 num == 345
str++; // 這時 str 指到字元 '\0'
如果你是天才, 當然頭腦裡想像就好; 如果不是, 把過程寫滿幾張
A4 紙來彌補吧...
: 最後每一個字元跑完 num 就是十進位的答案
: 十進位似乎也可以這樣算 但是不太懂原理
: 2.
: 如果 function(char *str) 傳入的是要轉換的字
如果你不會改到原字串的內容,( 把 "Apple"改成 "Orange"), 參數
的型態請用 char const *,雖然兩者操作上有時是一樣合法的, 但
在內行人來看是有不同的意義, 這樣會混淆別人的理解.
呼叫function的人為了怕你改到他的字串, 可能會寫出下面的程式
碼 :
char copy[ BUFFER_SIZE ];
strcpy( copy, src );
function( copy );
作了很多白功
: str 取得的是 4321
: 如果今天要取得第一個字元的數值是否有直接取得的方式?
: 而不用 (*str) - '0' 這樣用ASCII的方式去做?
: 謝謝
用映射的方式 :
int charToInteger[ 256 ];
for( char c = '0'; c <= '9'; ++c )
charToInteger[ c ] = c - '0';
用巨集的方式 :
#define CHAR_TO_INTEGER( c )\
c - '0'
對 char 來說沒有直接取得的方法, 你所能做的就是讓他更有可讀
性, 很多人直接hard code : c - 48, 這種程式碼我通常都直接丟
掉...
--
███ ◢█◣ ██◣ ◢█◣
█ ▄▄ █▄█ █▄█ █▄█
█ █ █ █ ◣ █ █
█▄▄ ███ █ █ ███ █ █ ██ ▌
█▄▄ █ █ ▄█ █ █ █ █ █ █▌ T-ara板歡迎你加入
▄▄█ █▄█ ▊ █▅█ █▄█ █ █ ∮makigoto123
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
→
09/27 13:34, , 1F
09/27 13:34, 1F
※ 編輯: loveme00835 來自: 140.121.197.115 (09/27 14:01)
推
09/27 15:11, , 2F
09/27 15:11, 2F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):