嗯,今天看了JUly的编程艺术系列的文章,讲的很好,这个字符串到数字的转换程序写的很全面,考虑了空指针,非法输入,溢出问题等。非常好,学习了,现在把这个程序贴在这里,供以后需要时使用。
另外一点,如果把n定义成长整型,最后返回时系统会自动转换成整型, int类型的数据范围是-2147483648~2147483647,也就是负二十多亿到正的二十多亿,带符号十进制数11位,无符号12位。因此我给字符串动态分配了12位大小的char型长度。
// StrToInt(1).cpp : 定义控制台应用程序的入口点。
/*
<span style="white-space:pre"> </span>@mishidemudong
<span style="white-space:pre"> </span>@2015-5-27
*/
#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
int StrToInt(const char* str)
{
static const int MAX_INT = (int)((unsigned)~0 >> 1);
static const int MIN_INT = -(int)((unsigned)~0 >> 1)-1 ;
unsigned int n = 0;
//判断是否输入为空
if (str == NULL)
{
return 0;
}
//处理空格
while (isspace(*str))
++str;
//处理正负
int sign = 1;
if (*str == '+' || *str == '-')
{
if (*str == '-')
sign = -1;
++str;
}
//确定是数字后才执行循环
while (isdigit(*str))
{
//处理溢出
int c = *str - '0';
if (sign > 0 && (n > MAX_INT / 10 || (n == MAX_INT / 10 && c > MAX_INT % 10)))
{
n = MAX_INT;
break;
}
else if (sign < 0 && (n >(unsigned)MIN_INT / 10 || (n == (unsigned)MIN_INT / 10 && c > (unsigned)MIN_INT % 10)))
{
n = MIN_INT;
break;
}
//把之前得到的数字乘以10,再加上当前字符表示的数字。
n = n * 10 + c;
++str;
}
if (sign==-1)
n = 0-n;//vs2013这里会出现点问题:一元负运算符应用于无符号类型,结果仍为无符号类
return n; //所以我改了一下
}
int _tmain(int argc, _TCHAR* argv[])
{
char *str;
int Trans_Num = 0;
str = (char *)malloc(12*sizeof(char));
gets_s(str,12);
Trans_Num=StrToInt(str);
printf("%d", Trans_Num);
return 0;
}