【字符串處理算法】字符串包含的算法設計及C代碼實現【轉】
轉自:http://blog.csdn.net/zhouzhaoxiong1227/article/details/50679587
版權聲明:本文為博主原創文章,對文章內容有任何意見或建議,歡迎與作者單獨交流,作者QQ(微信):245924426。
一、需求描述
輸入一個由數字構成的字符串,編寫程序將該字符串轉換為整數並輸出。
例如,如果輸入的字符串是“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代碼實現【轉】