将字符串(包含数字)转换为整数并返回该整数

时间:2013-08-14 17:33:16

标签: c++ arrays string

我现在正在使用C ++编写代码,我应该创建一个接收一串数字并将其转换为整数然后返回该值的函数。例如,如果我将“4569”作为字符串传递,它将返回4569整数值。 任何人都可以帮我指出我哪里错了???提前谢谢:)

#include<iostream>
#include<cstdlib>
using namespace std;

void getInput(char arr[] , int size )
{
    cout<<"ENTER THE ARRAY"<<endl;
    cin.getline(arr,size);

}

int stringToInteger(char source[])
{
    int sum = 0;
    int y=strlen(source);
    int multiply = 1;
    for( int i=y ; i>=0 ; i--)
    {
        int n= source[i];
        sum = (sum + (n * multiply));
        multiply = (multiply *10);
    }
    return sum;
}

int main()
{
    const int size =100;
    char inputArr [size];
    getInput (inputArr, size );

    int x = stringToInteger (inputArr );
    cout<<"THE RETURNED INTEGER VALUE IS"<<endl;
    cout<<x<<endl;
    return 0;
}

4 个答案:

答案 0 :(得分:2)

首先,你是从字符串结尾后的字符开始的。如果长度(由strlen返回)为y,则有效索引为0 <= i < y。所以你的循环想要从y-1开始。

for( int i=y-1 ; i>=0 ; i--)
            ^^

然后,您需要将每个ASCII数字转换为0到9之间的值,方法是减去“0”的ASCII值:

int n= source[i] - '0';
                 ^^^^^

然后你应该检测并处理错误的输入,包括太大而无法用int表示的值。

然后,一旦你学会了如何在C中实现它,就扔掉它并使用C ++库:

std::string input;
std::getline(std::cin, input);
int x = std::stoi(input);

答案 1 :(得分:1)

尝试,

#include <stdlib.h>

和您的main()

int x = atoi(inputArr);

答案 2 :(得分:0)

我不确定您为什么不使用atoistd::stoi,但您的算法存在逻辑缺陷:

int stringToInteger(char source[])
{
    int sum = 0;
    int y=strlen(source);
    int multiply = 1;
    for(int i=y - 1; i >= 0; i--) // you were starting at y, which is 1 passed the end of the array
    {
        int n = (int)(source[i] - '0');
        sum += (n * multiply); // += makes this more readable
        multiply *= 10; // same with  *=
    }
    return sum;
}

也就是说,如果这不是家庭作业,那么您应该使用https://stackoverflow.com/a/18238566/529761https://stackoverflow.com/a/18238682/529761发布的解决方案(取决于您的语言要求)。

此外,即使此更改也存在一个潜在问题:如果source包含非数字字符,则无法正常工作。如果你遇到一个不应该存在的角色,一个简单的方法就是突破:

int stringToInteger(char source[])
{
    int sum = 0;
    int y=strlen(source);
    int multiply = 1;
    for(int i=y - 1; i >= 0; i--) // you were starting at y, which is 1 passed the end of the array
    {
        int n = (int)(source[i] - '0');
        if (n < 0 || n > 9)
            break;
        sum += (n * multiply); // += makes this more readable
        multiply *= 10; // same with  *=
    }
    return sum;
} 

答案 3 :(得分:0)

在您被允许使用库函数(上述strlenatoi)之前,无需致电strtol,您可以使用此功能:

int stringToInteger(char *source)
{
  int sum = 0;
  if (source)
    while (*source >= '0' && *source <= '9')
    {
      sum = 10*sum + *source - '0';
      source++;
    }
  return sum;
}

正如其他所有答案所暗示的那样,你忘记了ASCII字符&#39; 0&#39;和二进制值0