1. 程式人生 > >【字符串處理算法】字符串包含的算法設計及C代碼實現【轉】

【字符串處理算法】字符串包含的算法設計及C代碼實現【轉】

字符串 整數 blank -- c語言 ipp lines c118 多個

轉自:http://blog.csdn.net/zhouzhaoxiong1227/article/details/50679587

一、需求描述

輸入一個由數字構成的字符串,編寫程序將該字符串轉換為整數並輸出。

例如,如果輸入的字符串是“12345”,那麽輸出的整數是12345。註意,不要使用C語言的庫函數atoi。

二、算法設計

我們都知道,如果給定一個整數123,那麽其表示方法是:123=1*100+2*10+3。也就是說,一個整數是由其各位上的數字按照位數求和組成的。

因此,這個需求的解決方法很簡單,只要將字符串中的各位數字按照其位數相加就行了。在此過程中,要考慮一些特殊情況。

程序的總體流程如圖1所示。

技術分享

圖1 程序的總體流程

三、特殊流程考慮

在編寫程序的過程中,我們要對輸入的數字串的長度及格式多做考慮,如:

1.如果輸入的字符串中包含了除數字之外的其它字符,那麽程序直接返回,不進行後續處理。

2.如果數字串是以一個或多個字符0開頭的,則要先將其去掉之後再進行後續處理。

3.因為在c語言中,整型(int)所能表示的最大數為2147483647,所以如果輸入的數字串大於了“2147483647”,那麽程序直接返回,不進行後續處理。

四、程序代碼

   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
/********************************************************************** * 版權所有 (C)2016, Zhou Zhaoxiong。 * * 文件名稱: StrToInt.c * 文件標識: 無 * 內容摘要: 將字符串轉換為整數 * 其它說明: 例如, 將"123"轉換為123 * 當前版本: V1.0 * 作 者: Zhou Zhaoxiong * 完成日期: 20160218 * **********************************************************************/ #include <stdio.h> #include <limits.h> // 由於在代碼中使用了INT_MAX, 因此要包含該頭文件 // 重新定義數據類型 typedef signed char INT8; typedef int INT32; typedef unsigned int UINT32; // 函數聲明 INT32 CalIntVal(INT32 iBitLen); INT32 JudgeIfOverFlow(INT8 *pszTestStr); /********************************************************************** * 功能描述: 主函數 * 輸入參數: 無 * 輸出參數: 無 * 返 回 值: 0-執行成功 其它-執行失敗 * 其它說明: 無 * 修改日期 版本號 修改人 修改內容 * --------------------------------------------------------------------- * 20160218 V1.0 Zhou Zhaoxiong 創建 ***********************************************************************/ INT32 main() { INT8 szInputStr[100] = {0}; INT8 szTestStr[100] = {0}; INT32 iResultInt = 0; // 轉換之後的整數最大支持2147483647 UINT32 iPosFlag = 0; UINT32 iTestStrLen = 0; UINT32 iBitVal = 0; INT32 iRetVal = 0; printf("Max value of int is %d\n", INT_MAX); // 求出int的最大值 printf("Please input the string: \n"); scanf("%s", szInputStr); printf("InputStr=%s\n", szInputStr); // 判斷輸入的字符串中是否有除數字之外的其它字符, 若有, 則直接退出 for (iPosFlag = 0; iPosFlag < strlen(szInputStr); iPosFlag ++) { if (szInputStr[iPosFlag] < ‘0‘ || szInputStr[iPosFlag] > ‘9‘) { printf("%s is not a digital string, please check!\n", szInputStr); return -1; } } // 如果字符串前面有字符0, 則將其去掉 iPosFlag = 0; while (szInputStr[iPosFlag] == ‘0‘) { iPosFlag ++; } // 獲取去除0之後的字符串值 strncpy(szTestStr, szInputStr+iPosFlag, strlen(szInputStr)-iPosFlag); // 判斷字符串是否大於2147483647, 若是, 則直接退出 iRetVal = JudgeIfOverFlow(szTestStr); if (iRetVal != 0) { printf("%s is bigger than INT_MAX(2147483647), please check!\n", szTestStr); return -1; } // 計算字符串對應的整數值 iTestStrLen = strlen(szTestStr); iResultInt = 0; for (iPosFlag = 0; iPosFlag < iTestStrLen; iPosFlag ++) { iBitVal = szTestStr[iPosFlag] - ‘0‘; // 計算每一位對應的數字 iResultInt = iResultInt + iBitVal * CalIntVal(iTestStrLen-iPosFlag); } printf("ResultInt=%d\n", iResultInt); return 0; } /********************************************************************** * 功能描述: 判斷輸入的字符串是否溢出 * 輸入參數: pszTestStr-測試字符串 * 輸出參數: 無 * 返 回 值: 1-溢出 0-未溢出 * 其它說明: 判斷字符串是否大於2147483647, 若是, 則溢出 * 修改日期 版本號 修改人 修改內容 * --------------------------------------------------------------- * 20160218 V1.0 Zhou Zhaoxiong 創建 ***********************************************************************/ INT32 JudgeIfOverFlow(INT8 *pszTestStr) { UINT32 iTestStrLen = 0; INT8 szProcessedStr[100] = {0}; INT8 szMaxValOfInt[100] = {0}; snprintf(szMaxValOfInt, sizeof(szMaxValOfInt)-1, "%d", INT_MAX); // 求出int的最大值 iTestStrLen = strlen(pszTestStr); if (iTestStrLen > strlen(szMaxValOfInt)) // 長度超過 { return 1; } else if (iTestStrLen == strlen(szMaxValOfInt)) // 長度相等 { if (strcmp(pszTestStr, szMaxValOfInt) > 0) // 溢出 { return 1; } else { return 0; } } else // 測試字符串長度小於"2147483647"的長度, 未溢出 { return 0; } } /********************************************************************** * 功能描述: 求字符串中的每一位所對應的整數值 * 輸入參數: iBitLen-對應整數的第多少位 * 輸出參數: 無 * 返 回 值: 該位所對應的整數值 * 其它說明: 無 * 修改日期 版本號 修改人 修改內容 * --------------------------------------------------------------- * 20160218 V1.0 Zhou Zhaoxiong 創建 ***********************************************************************/ INT32 CalIntVal(INT32 iBitLen) { if (iBitLen == 1) // 個位 { return 1; } else { return 10 * CalIntVal(iBitLen-1); } }
來自CODE的代碼片
StrToInt.c

五、程序測試

我們將編寫好的程序“StrToInt.c”上傳到Linux機器,並使用“gcc -g -o StrToIntStrToInt.c”命令對該程序進行編譯,生成“StrToInt”文件。下面對程序進行詳細的測試。

1.輸入字符串為“12345”時,程序運行情況如下:

Max value of int is 2147483647

Please input the string:

12345

InputStr=12345

ResultInt=12345

2.輸入字符串為“-12345”時,程序運行情況如下:

Max value of int is 2147483647

Please input the string:

-12345

InputStr=-12345

-12345 is not a digital string, please check!

3.輸入字符串為“123456a”時,程序運行情況如下:

Max value of int is 2147483647

Please input the string:

123456a

InputStr=123456a

123456a is not a digital string, please check!

4.輸入字符串為“012345”時,程序運行情況如下:

Max value of int is 2147483647

Please input the string:

012345

InputStr=012345

ResultInt=12345

5.輸入字符串為“0123450”時,程序運行情況如下:

Max value of int is 2147483647

Please input the string:

0123450

InputStr=0123450

ResultInt=123450

6.輸入字符串為“2147483647”時,程序運行情況如下:

Max value of int is 2147483647

Please input the string:

2147483647

InputStr=2147483647

ResultInt=2147483647

7.輸入字符串為“2147483648”時,程序運行情況如下:

Max value of int is 2147483647

Please input the string:

2147483648

InputStr=2147483648

2147483648 is bigger than INT_MAX(2147483647), please check!

8.輸入字符串為“123456789012”時,程序運行情況如下:

Max value of int is 2147483647

Please input the string:

123456789012

InputStr=123456789012

123456789012 is bigger than INT_MAX(2147483647), please check!

可見,對於上面考慮到的幾種特殊情況,程序均能做出正確的處理。

六、需求擴展

基於本文中的需求和程序,我們可考慮對需求進行以下擴展:

1.不限制輸入的字符串中只能包含數字,也可以在開頭包含“+”或“-”。如果字符串是以“+”開頭,那麽最後輸出的整數是正整數;如果字符串是以“-”開頭,那麽最後輸出的整數是負整數。

2.如果輸入的數字串大於了“2147483647”,那麽程序直接輸出整數值為2147483647。

【字符串處理算法】字符串包含的算法設計及C代碼實現【轉】