【字符串處理算法】字符串轉(zhuǎn)換為整數(shù)的算法設(shè)計及C代碼實現(xiàn)
一、需求描述
輸入一個由數(shù)字構(gòu)成的字符串,編寫程序?qū)⒃撟址D(zhuǎn)換為整數(shù)并輸出。
例如,如果輸入的字符串是“12345”,那么輸出的整數(shù)是12345。注意,不要使用C語言的庫函數(shù)atoi。
二、算法設(shè)計
我們都知道,如果給定一個整數(shù)123,那么其表示方法是:123=1*100+2*10+3。也就是說,一個整數(shù)是由其各位上的數(shù)字按照位數(shù)求和組成的。
因此,這個需求的解決方法很簡單,只要將字符串中的各位數(shù)字按照其位數(shù)相加就行了。在此過程中,要考慮一些特殊情況。
程序的總體流程如圖1所示。
圖1 程序的總體流程
三、特殊流程考慮
在編寫程序的過程中,我們要對輸入的數(shù)字串的長度及格式多做考慮,如:
1.如果輸入的字符串中包含了除數(shù)字之外的其它字符,那么程序直接返回,不進(jìn)行后續(xù)處理。
2.如果數(shù)字串是以一個或多個字符0開頭的,則要先將其去掉之后再進(jìn)行后續(xù)處理。
3.因為在C語言中,整型(int)所能表示的***數(shù)為2147483647,所以如果輸入的數(shù)字串大于了“2147483647”,那么程序直接返回,不進(jìn)行后續(xù)處理。
四、程序代碼
- /**********************************************************************
- * 版權(quán)所有 (C)2016, Zhou Zhaoxiong。
- *
- * 文件名稱: StrToInt.c
- * 文件標(biāo)識: 無
- * 內(nèi)容摘要: 將字符串轉(zhuǎn)換為整數(shù)
- * 其它說明: 例如, 將"123"轉(zhuǎn)換為123
- * 當(dāng)前版本: V1.0
- * 作 者: Zhou Zhaoxiong
- * 完成日期: 20160218
- *
- **********************************************************************/
- #include <stdio.h>
- #include <limits.h> // 由于在代碼中使用了INT_MAX, 因此要包含該頭文件
- // 重新定義數(shù)據(jù)類型
- typedef signed char INT8;
- typedef int INT32;
- typedef unsigned int UINT32;
- // 函數(shù)聲明
- INT32 CalIntVal(INT32 iBitLen);
- INT32 JudgeIfOverFlow(INT8 *pszTestStr);
- /**********************************************************************
- * 功能描述: 主函數(shù)
- * 輸入?yún)?shù): 無
- * 輸出參數(shù): 無
- * 返 回 值: 0-執(zhí)行成功 其它-執(zhí)行失敗
- * 其它說明: 無
- * 修改日期 版本號 修改人 修改內(nèi)容
- * ---------------------------------------------------------------------
- * 20160218 V1.0 Zhou Zhaoxiong 創(chuàng)建
- ***********************************************************************/
- INT32 main()
- {
- INT8 szInputStr[100] = {0};
- INT8 szTestStr[100] = {0};
- INT32 iResultInt = 0; // 轉(zhuǎn)換之后的整數(shù)***支持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);
- // 判斷輸入的字符串中是否有除數(shù)字之外的其它字符, 若有, 則直接退出
- 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;
- }
- // 計算字符串對應(yīng)的整數(shù)值
- iTestStrLen = strlen(szTestStr);
- iResultInt = 0;
- for (iPosFlag = 0; iPosFlag < iTestStrLen; iPosFlag ++)
- {
- iBitVal = szTestStr[iPosFlag] - '0'; // 計算每一位對應(yīng)的數(shù)字
- iResultIntiResultInt = iResultInt + iBitVal * CalIntVal(iTestStrLen-iPosFlag);
- }
- printf("ResultInt=%d\n", iResultInt);
- return 0;
- }
- /**********************************************************************
- * 功能描述: 判斷輸入的字符串是否溢出
- * 輸入?yún)?shù): pszTestStr-測試字符串
- * 輸出參數(shù): 無
- * 返 回 值: 1-溢出 0-未溢出
- * 其它說明: 判斷字符串是否大于2147483647, 若是, 則溢出
- * 修改日期 版本號 修改人 修改內(nèi)容
- * ---------------------------------------------------------------
- * 20160218 V1.0 Zhou Zhaoxiong 創(chuàng)建
- ***********************************************************************/
- 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;
- }
- }
- /**********************************************************************
- * 功能描述: 求字符串中的每一位所對應(yīng)的整數(shù)值
- * 輸入?yún)?shù): iBitLen-對應(yīng)整數(shù)的第多少位
- * 輸出參數(shù): 無
- * 返 回 值: 該位所對應(yīng)的整數(shù)值
- * 其它說明: 無
- * 修改日期 版本號 修改人 修改內(nèi)容
- * ---------------------------------------------------------------
- * 20160218 V1.0 Zhou Zhaoxiong 創(chuàng)建
- ***********************************************************************/
- INT32 CalIntVal(INT32 iBitLen)
- {
- if (iBitLen == 1) // 個位
- {
- return 1;
- }
- else
- {
- return 10 * CalIntVal(iBitLen-1);
- }
- }
五、程序測試
我們將編寫好的程序“StrToInt.c”上傳到Linux機器,并使用“gcc -g -o StrToIntStrToInt.c”命令對該程序進(jìn)行編譯,生成“StrToInt”文件。下面對程序進(jìn)行詳細(xì)的測試。
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!
可見,對于上面考慮到的幾種特殊情況,程序均能做出正確的處理。
六、需求擴展
基于本文中的需求和程序,我們可考慮對需求進(jìn)行以下擴展:
1.不限制輸入的字符串中只能包含數(shù)字,也可以在開頭包含“+”或“-”。如果字符串是以“+”開頭,那么***輸出的整數(shù)是正整數(shù);如果字符串是以“-”開頭,那么***輸出的整數(shù)是負(fù)整數(shù)。
2.如果輸入的數(shù)字串大于了“2147483647”,那么程序直接輸出整數(shù)值為2147483647。
【本文是51CTO專欄作者周兆熊的原創(chuàng)文章,作者微信公眾號:周氏邏輯(logiczhou)】