最近開始自學c語言,在看k&r的《c程式語言》。練習2-3要求寫乙個函式,將輸入的十六進製制數字字串轉換成與之等價的整數值,配套答案沒有擴充套件程式的通用性,所以我就稍微改造改造。
配套的答案是這樣的(自己新增了注釋):
1#define yes 1
2#define no 034
/*htoi:將十六進製制數字字串轉換成十進位制數
5* 如果發現'0x'或'0x'則跳過並設定十六進製制數的起點
6* 檢查後續字元是否是0-9,a-f或是a-f
7* 如果是則將其轉換為整形
8* 如果不是則停止檢查,數字結束
9* 通過公式計算相應的十進位制值並返回
10*/
11int htoi(char
s)1220}
21 n = 0; /*
初始化返回變數
*/22 inhex = yes; /*
假設在合法字元中
*/23
for ( ; inhex == yes; ++i)
35return
n;36 }
該函式需要匯入乙個字元陣列,我在 main() 函式中寫了獲取陣列的**將獲取字元陣列的**寫成(假設最多獲取10個長度的字元陣列,因為陣列以 '\0' 結尾,因此總共最多獲取9個有效字元):
1intc,i;
2char input[10];3
4for ( i = 0; i < 10-1 && ((c = getchar()) != eof); ++i)
5 input[i] =c;
6 input[i] = '
\0';
將得到的字元陣列傳入 htoi() 函式中即可計算出轉換後的值。
但是這樣有個缺陷:字元陣列開頭必須是 「0x」 或 「0x」 或 數字0-9 或 字母a-f 或 a-f,否則 htoi() 函式只返回 0。這樣就降低了程式的通用性,那麼如何才能當字元陣列前頭包含無用字元時,只有檢測到 「0x」 或 「0x」 時才繼續檢測後續字元,並計算返回正確的結果?
我的做法是在 htoi() 函式中檢測是否為 「0x」 或 「0x」 的**上新增迴圈:
1int htoi(chars)2
13}14else
15 ++i; /*
如果不符合則迴圈到底,最後s[i]='\0'
*/16
}17 n = 0
;18 inhex =yes;
19for ( ; inhex == yes; ++i)
1920
int htoi(char
s)2132}
33else
34 ++i;35}
36 n = 0
;37 inhex =yes;
38for ( ; inhex == yes; ++i)
50return
n;51 }
2015.06.16更新
根據 @garbageman 的建議:
1.將獲取字元陣列的**封裝為函式 getstring()
2.修改 htoi() 函式的判斷語句,當字元陣列不以 「0x」 或 「0x」 開頭時也能進行計算
3.簡化 htoi() 函式結束迴圈的標記,去除 inhex 變數
另:1.將能夠獲取的字元陣列的最大長度定義為常量 maxc
2.將 htoi() 函式的返回值修改為 double 以容納更大的結果
完整程式**如下:
1 #include 23#define maxc 100 /* 字元陣列的最大長度 */45
double htoi(char
s);6
void getstring(char
s);7
8int main(void)9
1617
double htoi(char
s)18
30else
31break; /*
0之後不是x或x的話則從0開始計算
*/32}33
/*是以下符合十六進製制的字元則從其開始計算
*/34
else
if((s[i] >= '
0' && s[i] <= '9'
)35 || (s[i] >= '
a' && s[i] <= 'f'
)36 || (s[i] >= '
a' && s[i] <= 'f'
))37
break;38
else
/*非十六進製制字元,跳過
*/39 i++;40}
41 n = 0.0;42
for ( ; ; ++i)
53return
n;54}55
56/*
獲取字元陣列
*/57
void getstring(char
s)58
程式設計小白C語言題目練習23
設 int b 2 表示式 b 2 b 1 的值是 這個 的叫左移運算子,這個 是右移運算子 左移運算子將乙個數的各二進位制位全部左移若干位,移動的位數由右運算元指定,右運算元必須是非負值,其右邊空出的位用0填補,高位左移溢位則捨棄該高位。左移一位相當於該數乘以2,左移2位相當於該數乘以2 2 4。...
C語言程式設計練習
1 給你任意三個整形資料,找出其中最大乙個整形數。include main int findmax int x,int y,int z else if z max return max 使用函式 三目運算子 include int main int findmax int x,int y 2 求1 ...
c語言程式設計練習
練習 賬號 taylent problem 2000 ascii碼排序 problem description 輸入三個字元後,按各字元的ascii碼從小到大的順序輸出這三個字元。includeint main return 0 補充知識點 在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用...