字符串转换数字

本文介绍了一个复杂的C语言实现,用于将字符串转换为整数。该实现考虑了各种边界情况,如空字符串、前导空白字符、正负号处理、非数字字符的存在等。通过对每个字符的细致检查和适当的数学操作,确保了转换过程的准确性和鲁棒性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>


#define MAX_STR_LEN 32


#define MAX_INT_VALUE 0xEFFFFFFF


#define LESS_ZERO 1
#define BIG_ZERO 2


int strtoint(char *pStr)
{
int i = 0;
int j = 0;
int iStrLen = 0;
int iTmp = 0;
static int iNum = 0;
int iFlag = 0;
int iCount = 0;
int iDataBegin = 0;
int iDataEnd = 0;
int iFlagadd = 0;
char strNum[MAX_STR_LEN] = "";
char strNumTmp[MAX_STR_LEN] = "";
char strNumTmpt[MAX_STR_LEN] = "";

if ( NULL == pStr || 0 >= strlen(pStr) )
{
printf("pStr = 0\n");
return 0;
}


printf("strlen(pStr) = %d\n", strlen(pStr));
iStrLen = strlen(pStr);

printf("pStr) = %s\n", (pStr));
strncpy(strNum, pStr, iStrLen);
printf("strNum) = %s\n", (strNum));

for (i =0; i < iStrLen; i++)
{
printf("strNum[%d] = %d\n", i , strNum[i]);
if (strNum[i] == 32 && 0 == iCount)
{
printf("strNum[%d] == %d iCount = %d\n", i, 32, iCount);
continue;
}
else if (strNum[i] == 32 && 0 != iCount)
{
break;
}

printf("xxxx\n");
if ( ('-' == strNum[i] || '+' == strNum[i]) )
{
printf("'-' == strNum[i] || '+' == strNum[i]\n");
printf("iCount = %d\n", iCount);
if ( 0 == iCount)
{
iDataBegin = i;
iCount++;
printf("iDataBegin = %d\n", iDataBegin);
}
iFlagadd++;
if ( 1 < iFlagadd )
{
return 0;
}
continue;
}

if ( strNum[i] < '0' || strNum[i] > '9')
{
printf("iDataEnd = %d\n", iDataEnd);

break;
}

printf("iCount = %d\n", iCount);
if ( 0 == iCount)
{
iDataBegin = i;
printf("iDataBegin = %d\n", iDataBegin);
}
iCount++;
iDataEnd = iDataBegin + iCount;
printf("iCount = %d\n", iCount);
}
printf("iDataBegin = %d\n", iDataBegin);
printf("iDataEnd = %d\n", iDataEnd);
if ( iDataBegin == iDataEnd )
{
return 0;
}
printf("strNum = %s\n", (strNum));
memset(strNumTmp, 0, MAX_STR_LEN);
memcpy(strNumTmp, strNum+iDataBegin, iDataEnd - iDataBegin);

printf("strNumTmp 33= %s\n", (strNumTmp));
iStrLen = strlen(strNumTmp);
printf("iStrLen = %d\n", iStrLen);

if ( 0 >= iStrLen)
{
return 0;
}

if ( strNumTmp[0] == '-' )
{
iFlag = 1;
iStrLen--;


strcpy(strNumTmpt, strNumTmp+1);
printf("strNumTmp = %s\n", strNumTmpt);
}else if ('+' == strNumTmp[0])
{
iStrLen--;
strcpy(strNumTmpt, strNumTmp+1);
}
else
{
strncpy(strNumTmpt, strNumTmp, iStrLen);
}

if ( 0 >= iStrLen)
{
return 0;
}

printf("strNumTmpt >0 iStrLen = %d\n", iStrLen);


for (j =iStrLen-1, i = 0; j >= 0; j--, i++)
{
if ( j == iStrLen-1 )
{
printf("strNum[%d]: %d,  '0' = %d\n", iStrLen-1, strNumTmpt[j], '0');
iNum = strNumTmpt[j] - '0';
printf("iNum = %d\n", iNum);


continue;
}
printf("strNumTmpt[%d] = %d '0' = %d\n",j, strNumTmpt[j], '0');
iTmp = strNumTmpt[j] - '0';
printf("iTmp = %d\n", iTmp);
printf("i = %d\n", i);

iNum += iTmp * pow(10, i);
printf("iNum = %d\n", iNum);
}


if ( iFlag )
{
iNum = -iNum;
printf("iNum = %d\n", iNum);
}



return iNum;
}


int main()
{
int i = 0;
int iN = 0;
char *str[30]={"1", "+1", "-1", "123", "-123", "010", "+00131204",\
"-01324000", "2147483647", "-2147483647", "2147483648", "-2147483648",\
"-2147483649", "abc", "-abc", "1a", "23a8f","-3924x8fc","   321", \
"   -321", "123 456", "123   ", "   - 321", "  +4488", " + 413", \
"++c", "++1", "--2", " -2"};

iN = strtoint("");
printf("iN = %d\n", iN);




iN = strtoint("1");
printf("iN = %d\n", iN);
iN = strtoint("-1");
printf("iN = %d\n", iN);

iN = strtoint("123");
printf("iN = %d\n", iN);

iN = strtoint("-123");
printf("iN = %d\n", iN);


iN = strtoint("010");
printf("iN = %d\n", iN);
iN = strtoint("+00131204");
printf("iN = %d\n", iN);
iN = strtoint("-12345");
printf("iN = %d\n", iN);
iN = strtoint("-01324000");
printf("iN = %d\n", iN);
iN = strtoint("2147483647");
printf("iN = %d\n", iN);

iN = strtoint("-2147483648");
printf("iN = %d\n", iN);
iN = strtoint("2147483648");
printf("iN = %d\n", iN);
iN = strtoint("-2147483649");
printf("iN = %d\n", iN);

iN = strtoint("abc");
printf("iN = %d\n", iN);
iN = strtoint("-abc");
printf("iN = %d\n", iN);

iN = strtoint("1a");
printf("iN = %d\n", iN);
iN = strtoint("23a8f");
printf("iN = %d\n", iN);

iN = strtoint("-3924x8fc");
printf("iN = %d\n", iN);
iN = strtoint("   321");
printf("iN = %d\n", iN);
iN = strtoint("123 456");
printf("iN = %d\n", iN);
iN = strtoint("123   ");
printf("iN = %d\n", iN);
iN = strtoint("- 321");
printf("iN = %d\n", iN);
iN = strtoint("   +4488");
printf("iN = %d\n", iN);
 
iN = strtoint(" + 413");
printf("iN = %d\n", iN);
iN = strtoint("++c");
printf("iN = %d\n", iN);
iN = strtoint("++1");
printf("iN = %d\n", iN);

iN = strtoint("--2");
printf("iN = %d\n", iN);
iN = strtoint("-2");
printf("iN = %d\n", iN);

return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值