如何使用 stoi() 将字符串转换为整数?

Posted

技术标签:

【中文标题】如何使用 stoi() 将字符串转换为整数?【英文标题】:How to convert string to integer using stoi()? 【发布时间】:2020-11-13 15:55:28 【问题描述】:

如果给定的字母集 a,g,w,k,l 中有超过 3 个字母一起(即彼此相邻),则您的字符串为“BAD”。如果一个数字重复超过 3 次,那么你的字符串就是“BAD”。如果字符串是 GOOD 则打印“1”,否则打印“0”。

对于第一个条件,我能够做到。但是对于第二个条件,我在将字符串转换为 int 时遇到问题。我尝试使用stoi(),但我认为我没有正确使用它。

#include<bits/stdc++.h>

using namespace std;

int main() 

  int t;
  cin >> t;
  while (t--> 0) 
    string s;
    cin >> s;
    int ccount = 0;

    int arr[10] = 0,0,0,0,0,0,0,0,0,0;
    bool b = true;
    for (int i = 0; i < s.size(); i++) 
      if (s[i] == 'a' || s[i] == 'g' || s[i] == 'w' || s[i] == 'k' || s[i] == 'l') 
        ccount++;
        if (ccount >= 3) 
          b = false;
          break;
        
       else if (isdigit(s[i])) 
        ccount = 0;
        int num = stoi( & s, sizeof(s) * i, 10);
        arr[num]++;
        int k = 0;
        for (k = 0; k < 10; k++) 
          if (arr[k] >= 3) 
            b = false;
            break;
          
        
       else 
        ccount = 0;
      

    
    if (b == true) 
      cout << 1 << endl;
     else 
      cout << 0 << endl;
    

  
  return 0;

输入:

3
qw2uha
awkl5
y2y2y2y2

输出:

1
0
0

编辑:ASCII 转换效果很好。

我有一个不那么重要的问题,我知道我们不能直接比较不同符号的整数,但我还是很好奇。

#include<bits/stdc++.h>
using namespace std;

int main() 

  int t;
  cin >> t;
  while (t--> 0) 
    string s;
    cin >> s;
    int ccount = 0;
    int arr[10] = 0,0,0,0,0,0,0,0,0,0;
    bool b = true;
    for (int i = 0; i < s.size(); i++) 
      if (s[i] == 'a' || s[i] == 'g' || s[i] == 'w' || s[i] == 'k' || s[i] == 'l') 
        ccount++;
        if (ccount >= 3) 
          b = false;
          break;
        
       else if (isdigit(s[i])) 
        ccount = 0;
        int num = s[i] - '0';
        arr[num]++;
        int k = 0;
        for (k = 0; k < 10; k++) 
          if (arr[k] > 3) 
            b = false;
            break;
          
        
       else 
        ccount = 0;
      
    
    if (b == true) 
      cout << 1 << endl;
     else 
      cout << 0 << endl;
    
  
  return 0;

我收到此警告:

14:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' aka 'unsigned int' [-Wsign-compare]
   14 |     for (int i = 0; i < s.size(); i++) 
      |                     ~~^~~~~~~~~~
]

有什么办法可以解决这个警告吗?

【问题讨论】:

stoi 不会像您认为的那样做。它尝试将 整个 字符串转换为整数,而此任务显然是指 single 数字 0 到9. 你所要做的就是对字母做完全相同的事情,但只是对字符“0”到“9”。这似乎与stoi 无关。 for (int i = 0; i &lt; s.size(); i++) - 尝试从 int 更改为 size_t (从逻辑上讲,您希望使用 std::string::size_type 来匹配 s.size() 的返回类型,但要输入的内容很多, 和size_t 保证可以工作,麻烦的是unsigned)。 【参考方案1】:

您可以像这样转换表示数字的单个 ASCII 字符:

int num = s[i] - '0';

之所以有效,是因为在字符串内部,每个字符都由一个 ASCII 码表示 - 它们列在下表中。字符 '0' 的 ASCII 代码为十进制 48,其他数字从那里递增。当您执行 s[i] - '0' 并说 s[i]'5' 时,它计算出 53 - 48 = 5。 `


std::stoi() 仅在 string 以(可选空格)然后是数字开头时才有用,例如"1x"stoi 将提取数字 1)、" 123" (123) 或 "44kx2" (44)。由于您的s 字符串之前或之后可能有字符,您可以使用s.substr(i, 1) 将单个数字提取为string,然后使用std::stoi(),但上面的ASCII 转换更快/更简单/更多-直接。

【讨论】:

根本不需要进行任何 ASCII 转换,因为您可以直接与 '0''9' 进行字符比较或使用 std::isdigit @NathanPierson:我不确定你的意思是什么。代码已经在使用isdigit,我没有建议更改它——我刚刚为num 提供了一个新的计算。对 ASCII 的讨论只是为了让 OP 可以看到,在数字的 ASCII 表示中,它们具有递增的值,因此计算将起作用。 哦,是的,我现在明白了。

以上是关于如何使用 stoi() 将字符串转换为整数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个字符串转换为三个整数

如何使用 C++ 将字符串中的字符转换为整数变量

使用stoi()将字符串数组元素转换为c ++中的int?

将十进制字符串转换为十六进制字符串而不将字符串转换为整数

你如何实现自己的字符串到整数的转换

std::atoi() 和 std::stoi 有啥区别?