所以...我知道C++标准库中的atoi函数应该将字符串转换为整数...它是如何工作的?...(我正在努力学习东西,我只是想知道). ..如果您可以向我展示其中的代码或制作您自己的代码,那将会非常感激...提前感谢.
Gra*_*row 30
像这样的东西:
int atoi( const char *c ) {
int value = 0;
int sign = 1;
if( *c == '+' || *c == '-' ) {
if( *c == '-' ) sign = -1;
c++;
}
while ( isdigit( *c ) ) {
value *= 10;
value += (int) (*c-'0');
c++;
}
return value * sign;
}
Run Code Online (Sandbox Code Playgroud)
只要它们是数字,就可以遍历字符串中的字符.对于每一个,添加到您保留的计数器 - 要添加的值是该字符的整数值.这是通过从所讨论的数字的ascii值中减去ascii值'0'来完成的.
请注意,此代码不处理溢出.如果您传入"887452834572834928347578423485273"(不适合int),则结果未定义.
数字:
char *严格来说,A 是指向a的指针char.指针只是内存中某个地方的地址.在C/C++(和Java)中,字符串由字符组成,这些字符可以单独地被视为整数(通常是一个字节),这要归功于ASCII.
在C(和C++)中,指向某种类型的项的指针与指向该类型的元素数组的指针相同.纯C中的字符串只是chars的数组,最后有一个'\0'(NUL),这样你就知道什么时候你到达字符串的末尾而不必在任何地方传递它的长度(指针只是一个地址,它知道什么都没有指出).
暂时忽略const关键字.
C版本atoi循环遍历字符串中的每个字符.在*str++做几件事情(理解它是如何工作是很重要的,但它实际上编写C一个可怕的方式).它相当于*(str++).在str++返回的值str(指针),然后通过一个递增它(但它返回旧的值!).的*"解除引用"的指针,在一个基本上读取char从存储器.这char存储在digit然后进行比较NUL.字符以ASCII格式存储,它连续表示数字,因此我们可以检查digit是否在0到9之间.我们现在知道我们正在读取一个新数字,所以我们将前一个值乘以10以"移位"该值然后添加数字.
纯C版:
int atoi(const char* str) {
int num = 0;
char digit;
while ((digit = *str++) != '\0') {
if (digit < '0' || digit > '9') {
return num; /* No valid conversion possible */
}
num *= 10;
num += c - '0';
}
return num;
}
Run Code Online (Sandbox Code Playgroud)
C++字符串是一个更容易处理字符串的对象.您可以char *从C++字符串中获取.c_str().
C++版本(更可能是使用"return atoi(str.c_str());"来内联调用char*版本:
int atoi(const std::string& str) {
int n = 0;
for (int i = 0; i < str.size(); i += 1) {
char digit = str.at(i); /* Could probably use iterator here,
* but this is more explicit. */
if (digit < '0' || digit > '9') {
return n; /* No valid conversion possible. */
}
n *= 10;
n += digit - '0';
}
return n;
}
Run Code Online (Sandbox Code Playgroud)
编辑:修复了<>无法正确显示的问题.
编辑:添加了C++字符串版本
编辑:已修复,因此返回123 123a以防万一.
编辑:在C++版本中将stray num更改为n