我正在尝试使用stoi(),但编译器试图给我替换并且不会编译

时间:2015-01-06 04:02:51

标签: c++ string c++11

我只是通过HackerRanks练习我的C ++,而且我正在解决这个问题:

  

问题陈述

     

您将获得一个整数N.找到此数字中的数字   准确地划分N(除以0作为余数的除法)并显示   他们的数量。对于N = 24,有2位数 - 2&这两个   数字完全除以24.所以我们的答案是2。

     

注意

     

如果相同的数字在不同的位置重复两次,它应该   被计数两次,例如,对于N = 122,2精确地划分122并且出现在   那些'和数十'位置。所以对于这种情况,我们的答案是3.分部   0是未定义的。输入格式

     

第一行包含T(测试用例数),后跟T行   (每个都包含一个整数N)。

     

约束1≤T≤150

这是我的计划:

    1 #include <cmath>
    2 #include <string>
    3 #include <iostream>
    4 #include <cstdlib>
    5 using namespace std;
    6 void checkDigits(string);
    7 int main (){
    8   string val;
    9   int count = 0, i;
   10
   11   cin >> i;
   12   for (int j = 1; j <= i; j++){
   13     cin >> val;
   14     checkDigits(val);
   15   }
   16   return 0;
   17 }
   18
   19 void checkDigits(string s){
   20   int len, count = 0;
   21   int full, digit;
   22
   23   len = s.length();
   24   for(int i = 0; i < len; i++){
   25     full = stoi(s);
   26     digit = stoi(s[i]);
   27     if(full % digit == 0)
   28       count++;
   29   }
   30   cout << count;
   31 }

什么会导致我的编译器给我这个错误?

  

hackerrank2.cpp:在函数'void checkDigits(std :: string)'中:   hackerrank2.cpp:26:20:错误:调用重载'stoi(char&amp;)'是   模糊的数字= stoi(s [i]);                       ^ hackerrank2.cpp:26:20:注意:候选人是:在/usr/include/c++/4.8/string:52:0中包含的文件中,                    来自hackerrank2.cpp:2:/usr/include/c++/4.8/bits/basic_string.h:2823:3:注意:int   std :: stoi(con​​st string&amp;,std :: size_t *,int)stoi(con​​st   串和放大器; __str,size_t * __idx = 0,int __base = 10)^   /usr/include/c++/4.8/bits/basic_string.h:2823:3:注意:不知道   将参数1从'char'转换为'const string&amp; {aka const   性病:: basic_string的&放大器;}”   /usr/include/c++/4.8/bits/basic_string.h:2926:3:注意:int   std :: stoi(con​​st wstring&amp;,std :: size_t *,int)
  stoi(con​​st wstring&amp; __str,size_t * __idx = 0,int __base = 10)^   /usr/include/c++/4.8/bits/basic_string.h:2926:3:注意:不知道   将参数1从'char'转换为'const wstring&amp; {aka const   的std :: basic_string的&安培;}”

1 个答案:

答案 0 :(得分:5)

std::stoi()适用于字符串,而非字符;没有std::stoi()的重载接受char,这就是编译器告诉你的。 (请注意,列出的原型将const std::string &const std::wstring &作为它们各自的第一个参数。char &不能隐式转换为其中任何一个,因此编译器无法选择它应该使用哪个重载因为两者都不起作用。)

如果您知道该字符是数字,那么您可以使用这个简单的函数:

inline int ctoi(char c)
{
    return c - '0';
}

(或者只是内联:digit = s[i] - '0';