根据strtoul的文档,关于其返回值...



如果我要解析用户提供的字符串“0”,对于我的应用程序,“0”可能是有效条目,该怎么办?在那种情况下,我似乎无法通过使用strtoul来确定是否执行了有效的转换。还有另一种方法可以解决这个问题吗?

最佳答案



strtoul()返回的任何值都可以来自预期的字符串输入,也可以来自其他非预期的字符串。进一步的测试很有用。

以下字符串均从strtoul()返回0

  • OK "0""-0""+0"
  • 不好"""abc"
  • 通常认为可以:" 0"
  • 取决于目标,是否可以:"0xyz""0 ""0.0"
  • strtoul()具有多种检测模式。
    int base = 10;
    char *endptr;  //  Store the location where conversion stopped
    
    errno = 0;
    unsigned long y = strtoul(s, &endptr, base);
    
    if (s == endptr) puts("No conversion");      // "", "abc"
    else if (errno == ERANGE) puts("Overflow");
    else if (*endptr) puts("Extra text after the number"); // "0xyz", "0 ", "0.0"
    else puts("Mostly successful");
    

    尚未检测到什么。
  • 负输入。 strtoul()有效地环绕了strtoul("-1", 0, 10) == ULONG_MAX)在粗略的文档审阅中经常会漏掉此问题。
  • 允许前导空格。这可能会或可能不会。


  • 要检测负值,请执行以下操作:
    // find sign
    while (isspace((unsigned char) *s)) {
      s++;
    }
    char sign = *s;
    
    int base = 10;
    char *endptr;  //  Store the location where conversion stopped
    errno = 0;
    unsigned long y = strtoul(s, &endptr, base);
    
    if (s == endptr) puts("No conversiosn");
    else if (errno == ERANGE) puts("Overflow");
    else if (*endptr) puts("Extra text after the number");
    else if (sign == '-' && y != 0) puts("Negative value");
    else puts("Successful");
    

    关于c - 如何使用 `strtoul`解析可能为零的字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53764099/

    10-11 22:07