擴充套件《C程式語言》練習2 3程式通用性

2022-09-13 02:00:17 字數 2727 閱讀 3110

最近開始自學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個有效字元):

1

intc,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」 的**上新增迴圈:

1

int 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 2

3#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 補充知識點 在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用...