手动实现atoi
文章目录
关键在于异常,过滤空格,过滤小数点,更新状态
#include <string.h>
#include <exception>
#include <iostream>
#include <stdexcept>
using namespace std;
enum class State { NORMAL, ABNORMAL };
State state;
int My_atoi(const char* data) {
if (data == nullptr) {
state = State::ABNORMAL;
throw logic_error("nullptr is null");
}
int res = 0;
int length = strlen(data);
// 需要过滤空格
char* tmp;
bool flag = 1; // 代表是正数
while (*data == ' ') {
data++;
}
if (data == '\0') {
state = State::ABNORMAL;
throw logic_error("invalid num");
}
// 继续干
if (*data == '+') {
flag = 1;
data++;
}
if (*data == '-') {
flag = 0;
data++;
}
bool hasd = false;
while (*data >= '0' && *data <= '9' || *data == '.') { // 不考虑浮点数
if (hasd) {
data++;
continue;
}
if (*data == '.') {
data++;
hasd = true;
continue;
}
res = res * 10 + (*data - '0');
data++;
}
if (*data == '\0') {
state = State::NORMAL;
if (!flag) {
return -res;
}
return res;
}
state = State::ABNORMAL;
throw logic_error("args invalid");
}
int main() {
string s;
cin >> s;
cout << "raw: " << s << endl;
int res;
try {
res = My_atoi(s.c_str());
} catch (exception& e) {
cout << e.what() << endl;
}
cout << "res: " << res << " state: " << static_cast<int>(state) << endl;
}
#include <string.h>
#include <exception>
#include <iostream>
#include <stdexcept>
using namespace std;
enum class State { NORMAL, ABNORMAL };
State state;
int My_atoi(const char* data) {
if (data == nullptr) {
state = State::ABNORMAL;
throw logic_error("nullptr is null");
}
int res = 0;
int length = strlen(data);
// 需要过滤空格
char* tmp;
bool flag = 1; // 代表是正数
while (*data == ' ') {
data++;
}
if (data == '\0') {
state = State::ABNORMAL;
throw logic_error("invalid num");
}
// 继续干
if (*data == '+') {
flag = 1;
data++;
}
if (*data == '-') {
flag = 0;
data++;
}
bool hasd = false;
while (*data >= '0' && *data <= '9' || *data == '.') { // 不考虑浮点数
if (hasd) {
data++;
continue;
}
if (*data == '.') {
data++;
hasd = true;
continue;
}
res = res * 10 + (*data - '0');
data++;
}
if (*data == '\0') {
state = State::NORMAL;
if (!flag) {
return -res;
}
return res;
}
state = State::ABNORMAL;
throw logic_error("args invalid");
}
int main() {
string s;
cin >> s;
cout << "raw: " << s << endl;
int res;
try {
res = My_atoi(s.c_str());
} catch (exception& e) {
cout << e.what() << endl;
}
cout << "res: " << res << " state: " << static_cast<int>(state) << endl;
}