c++ - 如果字符串表示负数,则使用错误处理将字符串解析为无符号整数

标签 c++ string type-conversion

不幸的是,通过适当的错误处理将负数的字符串表示形式解析为无符号整数似乎比人们预期的要复杂得多。都不是std::stoul , 也不是 strtoul, 也不是 boost::lexical_cast stringstream 方法也检测不到“错误”并通过执行回绕愉快地解析字符串“-1”。

有没有其他方法可以通过正确的错误处理将字符串转换为 unsigned int?作为对 boost bug report 的评论提出的方式似乎有点……奇怪。

最佳答案

据我所知,标准库中没有这样的函数/运算符。你可以:

  • 预先检查字符串中的 - 字符,正如已经建议的那样,虽然很奇怪,但可以 AFAICT

    int mystrtoul(char const *s, unsigned &y)
    {
        if (strchr(s, '-') == NULL) {
            y = strtoul(s, NULL, 0);
            return 0;
        }
        return -1;
    }
    
  • 首先使用strtod()。它会检测负数,然后如果数字不是负数,您可以调用 strtoul(),例如:

    int yastrtoul(char const *s, unsigned &y)
    {
        if (strtod(s, NULL) >= 0) {
            y = strtoul(s, NULL, 0);
            return 0;
        }
        return -1;
    }
    
  • 自己完成所有事情,但要小心,因为检测溢出很棘手,因为存在未定义的行为。

关于c++ - 如果字符串表示负数,则使用错误处理将字符串解析为无符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35162937/

相关文章:

c++ - 使用操作当前对象的线程是否安全?

python - 带有字符数组的 Numpy ufunc.at

java - 不显示正确分数java

string - 确定满足汉明距离矩阵的字符串

C# 从泛型值到字符串的转换问题

c# - 如何在 C# 中将大十进制数转换为十六进制数(例如 : 588063595292424954445828)

Clojure:如何将字符串转换为长字符串?

c++ - 锁定资源(线程,C++)

c++ - Qt中如何通知MySql Server关闭

c++ - 当应用程序成为守护进程时,Valgrind 退出