c++ 我不能在cpp中将字符串改为int

yrdbyhpb  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(96)

我试图用递归解决一个问题,给出的数字是std::string的形式,所以在基本情况下,我试图通过使用stoi函数将其转换为int来返回数字,但编译器给出了一个荒谬的错误。

int solve(string a, int i, int k, string s) {
    int n = a.length();
    if (i == n and i != k) return 1000;
    if (i == k) {
        cout << stoi(s);
        int t = stoi(s);
        return t;
    }
    int incl = solve(a, i + 1, k, s + a[i]);
    int excl = solve(a, i + 1, k, s);
    return min(incl, excl);
}

编译者说

terminate called after throwing an instance of 'std::invalid_argument'
  what():  stoi
d6kp6zgx

d6kp6zgx1#

如果字符串中的字符不表示有效的整数,则std::invalid_argument将抛出stoi()。假设您的算法是正确的,避免运行时错误的一种方法是添加一个检查(使用std::is_digit),如果std::string中的char实际上是一个数字。

**旁注:**你从来不检查s是否为空...

#include <string>
#include <iostream>
#include <cctype>
#include <stdexcept>

int solve(std::string a, int i, int k, std::string s) {
    int n = a.length();
    if (i == n and i != k) return 1000;
    if (i == k) {
        bool isValid = !s.empty();
        for (char c : s) {
            if (!std::isdigit(c)) {
                isValid = false;
                break;
            }
        }

        if (!isValid) {
            throw std::invalid_argument("[invalid int representation]]");
            //or

            //return -1;
        }

        std::cout << s;
        int t = std::stoi(s);
        return t;
    }
    int incl = solve(a, i + 1, k, s + a[i]);
    int excl = solve(a, i + 1, k, s);
    return std::min(incl, excl);
}

int main() {
    try {
        solve("abc", 1, 1, "xyz"); //using @PaulMcKenzie's example
    } catch (const std::invalid_argument& e) {
        std::cerr << "{error}: " << e.what() << std::endl;
        //...other logic
    }
}

s使用基于范围的for-循环遍历,如果std::string中的char无效,则抛出std::invalid_argument,这在main中处理。

ztigrdn8

ztigrdn82#

首先,正如注解中所指出的,这不是编译器错误。相反,它是在运行时抛出的exception
根据CPPReferencestd::stoi()抛出std::invalid_argument“如果不能执行转换”。
这意味着无论s的内容是什么,它都不能正确地转换为整数。
在不知道s的内容的情况下,确实不可能知道转换失败的原因,但以下是一些可能的原因:

  1. s包含文本字符,例如“asdf120”
  2. s包含逗号分隔值,如“1,13,25”
    1.其他我没想到的原因。
    我建议创建一些包含s值的调试打印输出到类似std::cout的地方,并确保它是一个正确的整数。

相关问题