1

我正在尝试将字符串转换为整数。我记得一位老师说你必须从中减去 48,但我不确定,当我这样做时,我会得到 17 作为 A 的值,如果我是正确的 64。这是我的代码。任何更好的方法将不胜感激。

#include <cstdlib>
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
    string str;
    getline(cin,str);
    cout << str[0] - 48;
    getch();
}
4

4 回答 4

1

A不是数字,那么如何将其转换为 int?您的代码已经有效。例如,输入5,您将看到5输出。当然,它没有任何区别,因为您只是打印该值。但是您可以改为存储在int变量中:

int num = str[0] - 48;

顺便说一句,通常'0'用来代替 48(48 是 ASCII 码0)。这样你就可以写了str[0] - '0'

于 2013-10-31T16:02:09.147 回答
1

仅使用 C++ 工具的简单且类型安全的解决方案是以下方法:

#include <iostream>
#include <sstream>

int fromString(const std::string& s)
{
  std::stringstream stream;
  stream << s;

  int value = 0;
  stream >> value;

  if(stream.fail()) // if the conversion fails, the failbit will be set
  {                 // this is a recoverable error, because the stream
                    // is not in an unusable state at this point
    // handle faulty conversion somehow
    // - print a message
    // - throw an exception
    // - etc ...
  }

  return value;
}

int main (int argc, char ** argv)
{
  std::cout << fromString ("123") << std::endl; // C++03 (and earlier I think)
  std::cout << std::stoi("123") << std::endl; // C++ 11

  return 0;
}

注意fromString()您可能应该检查字符串的所有字符是否实际上形成了有效的整数值。例如,GH1234或者某些东西不会,并且在调用operator>>.

编辑:刚刚记住,检查转换是否成功的一种简单方法是检查failbit流的。我相应地更新了答案。

于 2013-10-31T16:12:00.000 回答
0

atoi将字符串转换为 int 的函数,但我猜您想在没有库函数的情况下执行此操作。

我能给你的最好的提示是看一下 ascii 表并记住:

int c = '6';
printf("%d", c); 

将打印 '6' 的 ascii 值。

于 2013-10-31T16:01:58.693 回答
0

atoi在 cstdlib 中 调用了一个最简单的函数: http ://www.cplusplus.com/reference/cstdlib/atoi/

int number = atoi(str.c_str()); // .c_str() is used because atoi is a C function and needs a C string

这些函数的工作方式如下:

int sum = 0;
foreach(character; string) {
    sum *= 10; // since we're going left to right, if you do this step by step, you'll see we read the ten's place first...
    if(character < '0' || character > '9')
         return 0; // invalid character, signal error somehow

    sum += character - '0'; // individual character to string, works because the ascii vales for 0-9 are consecutive
}

如果您给出“23”,则为 0 * 10 = 0。0 + '2' - '0' = 2。

下一个循环迭代:2 * 10 = 20。20 + '3' - '0' = 23

完毕!

于 2013-10-31T16:04:27.370 回答