0

我现在正在使用 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

4 回答 4

2

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

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

然后,您需要通过减去 '0' 的 ASCII 值,将每个 ASCII 数字转换为 0 到 9 的值:

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

那么您可能应该检测并处理错误输入,包括太大而无法用int.

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

std::string input;
std::getline(std::cin, input);
int x = std::stoi(input);
于 2013-08-14T17:44:03.767 回答
1

尝试,

#include <stdlib.h>

在你的main()

int x = atoi(inputArr);
于 2013-08-14T17:38:22.797 回答
0

无需调用strlen-- 直到您被允许使用库函数(上述atoistrtol),您可以使用:

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

正如几乎所有其他答案所暗示的那样,您忘记了 ASCII 字符 '0' 和 binary value 之间存在差异0

于 2013-08-14T20:25:58.960 回答
0

我不确定您为什么不使用atoior std::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(取决于您的语言要求)。

此外,即使此更改也有 1 个潜在问题:如果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;
} 
于 2013-08-14T18:04:20.303 回答