将字符转为数字(考虑越界、正负、空等情况)
*将字符转为数字(考虑越界、正负、空等情况)
注意:
1.设置一个全局变量来判断字符串是否为0.
2.字符为空,或者为字母时返回0;
3.判断第一个字符是否是±, 我们给负进行标记
4.判断整数是否发生上溢出或者下溢出。
5.此题为记录🗡指offer 67题。
```cpp
#include <iostream>
using namespace std;
#include <string>
enum Status{kValid = 0, kInvalid};
int g_nStatus = kValid; // 全局变量 字符为0 是为kValid, 不为0时为kInvalid
long long StrToIntCore(const char *dlight, bool minus);
int StrToInt(const char *str);
int main(void)
{
char num_str[50];
cout << "Enter a string: ";
cin.getline(num_str, 50);
while(num_str[0] != 'q')
{
int num = StrToInt(num_str);
cout << "String: " << num_str << ", Num: " << num << endl;
cin.clear();
cout << "Enter another string: ";
cin.getline(num_str, 50);
}
return 0;
}
int StrToInt(const char *str)
{
g_nStatus = kInvalid; // 默认设为 非 0
long long num = 0;
if(str != nullptr && *str != '\0')
{
bool minus = false; // 正负标记
if(*str == '+') // 判断正负
str++;
else if( *str == '-')
{
str++;
minus = true; // 为负数,标记为true
}
if(*str != '\0') // 当不空时
{
num = StrToIntCore(str, minus);
}
}
return (int)num;
}
long long StrToIntCore(const char *dlight, bool minus)
{
long long num = 0;
while(*dlight != '\0')
{
if(*dlight >= '0' && *dlight <= '9') // 0 - 9
{
int flag = minus ? -1 : 1; // 正负
num = 10 * num + flag * (*dlight - '0');
if((!minus && num > 0x7FFFFFFF) || (minus && num < (signed int)0x80000000)) // 是否溢出
{
num = 0;
break;
}
dlight++;
}
else // 非数字字符
{
num = 0;
break;
}
}
if(*dlight == '\0') // 当字符为0时,全局变量改变
g_nStatus = kValid;
return num;
}
***