不使用atoi/isdigit将字符串转换为整数

3

如何在不使用atoiatolisdigit等函数的情况下将字符串转换为数组?

假设我有一个const char *str和一个int *converted_val作为参数。

这是我的代码:

const char *c;
    for(c = str; (*c != '\0') && isdigit(*c); ++c){
                    *converted_value = *converted_value*10 + *c - '0';
    }
    return true;

但是再次强调,我不能没有isdigit。而且我不确定如何处理较大的字符串(例如:"10000000000000000")


1
处理大字符串是一个完全不同的问题。搜索“[c] bignum”获取一些想法。 - user3386109
可能是将字符串转换为整数C的重复问题。 - David C. Rankin
4个回答

4
int yetAnotherAtoi(char *str)
{
 int res = 0; // Initialize result

 // Iterate through all characters of input string and
 // update result
 for (int i = 0; str[i] != '\0'; ++i) {
     if (str[i]> '9' || str[i]<'0')
         return -1; # or other error...
     res = res*10 + str[i] - '0';
 }

 // return result.
 return res;
}

3

请将isdigit(*c)替换为*c >= '0' && *c <= '9'

const char *c;
....
for( c = str; *c != '\0' && *c >= '0' && *c <= '9'; ++c) {
    *converted_value = (*c - '0') + *converted_value*10;
}
return true;

请注意,ASCII符号'0''9'按升序排列。
您受限于converted_value的整数数据类型范围。

是的!完美!你有什么想法如何处理大数据情况吗?*str = "10000000000"? - Mike Henke
实际上,无论是 ASCII 还是其他编码标准,数字 09 的连续性都是有保障的。但对于字母 az,情况则并非如此。 - DevSolar
3
您受到 converted_value 整数类型的范围限制。 - Rabbid76
你应该在转换时检查是否溢出 INT_MAX(和 INT_MIN),并处理错误条件。或者将类型更改为 long(或您系统上的 64 位类型,例如 int64_t)。然后,您需要检查 64 位类型的限制并处理错误。 - David C. Rankin

2

更改:

int *converted_val

to

long int *converted_val

为了能够容纳更大的值,您可能需要更多的空间。您还可以考虑添加代码来检查输入字符串是否会导致输出变量溢出。请保留HTML标记。

0

如果你想在Visual Studio中将字符串转换为整数而不使用函数,可以像下面的代码一样操作:

#include "stdafx.h"
#include<iostream>
#include<string>
#include<conio.h>
using namespace std;

int main()
{

    std::string str ;
    getline(cin, str);
    int a = 0;
    for (int i = 0  ; i<str.length(); i++) {
        a = (int)(str[i] - 48) + a * 10;
    }
    cout << a;

    _getch();
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接