【问题标题】:Checking string to int error without loops/conditionals在没有循环/条件的情况下检查字符串到 int 错误
【发布时间】:2016-04-21 15:04:19
【问题描述】:

我在 HR 上遇到问题,但不知道如何在不使用条件语句的情况下检查错误。这是如何在 C++ 中完成的?

// if string is int output it, else output "Bad string"
// need to do this without any loops/conditionals
int main(){
    string S;
    char *end;
    long x;
    cin >> S;
    const char *cstr = S.c_str();
    x = strtol(cstr,&end,10);

    if (*end == '\0')
        cout << x;
    else
        cout << "Bad string";

    return 0;
}

我应该使用 strtol 以外的东西吗?

【问题讨论】:

  • std::stol 接受 std::string 并在无法进行转换时抛出异常。另外,您的标题是int,但您的代码使用long。没关系,但请纠正一个或另一个以保持一致。
  • 如果我使用 stoi,我可以将异常设置为自定义消息吗?我实际上需要一个我刚刚用 long 测试的 int。
  • 您捕获异常(有 2 个,用于 2 种不同的情况)并打印出您想要的任何内容。
  • 嗯,例外情况可能有点超出您目前所学的范围。有一个基本的介绍here,但它显示了捕获像ints 这样简单的东西,你需要catch(std::invalid_argument const&amp; e) { ... }。 catch 块与函数无关。
  • 规范说如果有任何循环或条件语句将被标记为错误。我想我需要使用stoi,然后弄清楚捕获异常是如何工作的。

标签: c++ error-handling conditional strtol


【解决方案1】:

stoi 确实是您想要使用的。

给定string S 中的输入,一种可能的处理方式是:

try {
    cout << stoi(S) << " is a number\n";
} catch(const invalid_argument& /*e*/) {
    cout << S << " is not a number\n";
}

Live Example

这里的违规行为是stoi 只需要使用string 的前导数字部分 确保整个字符串是int。所以“t3st”将失败,因为它不是由数字引导,但“7est”将成功返回 7。有 a handful of ways 以确保整个 string 被消耗,但是他们都需要if-check。

【讨论】:

  • 我认为 while 循环会将其标记为错误,但感谢 catch 行示例很有帮助
  • 成功了! try 和 catch 块正是我所需要的,谢谢。
  • @Jake 我不确定你的意思,“while 循环会将其标记为错误。”它似乎在示例链接中按预期工作。
  • 它可以工作,但是使用循环或条件的解决方案会在 HackerRank 上自动标记为错误。不过,我让它在没有循环的情况下工作,谢谢。
  • @Jake Lol,无论如何,循环与问题无关,我会编辑。
【解决方案2】:

一种方法是:

char const *m[2] = { "Bad string", S.c_str() };
cout << m[*end == '\0'];

【讨论】:

  • 无论看起来多么天真,== 都是有条件的。如果这不被视为条件语句,那么我会说应该考虑使用三元。
  • @JonathanMee 我假设“条件语句”是指带有条件运算符的语句,或者 if / while / for
猜你喜欢
  • 2018-03-21
  • 1970-01-01
  • 2022-01-03
  • 2014-08-28
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多