【问题标题】:Convert string to 32-bit int (signed or unsigned) and check for range errors将字符串转换为 32 位 int(有符号或无符号)并检查范围错误
【发布时间】:2019-12-26 08:33:59
【问题描述】:

我想将字符串(保证只包含数字)转换为 32 位 int。我知道 strtolstrtoimax,但它们似乎返回 64 位整数。

这就是我目前的做法:

#include <errno.h>
#include <inttypes.h>

typedef int32_t Int32;

Int32 strToIntValue(char* str) {
    char* end;
    errno = 0;
    int ret = strtoimax(str, &end, 10);

    if (errno==ERANGE) {
        printf("range error!\n");
        return 0;
    }
    else {
        return (Int32)ret;
    }
}

【问题讨论】:

  • 你可以添加类似:else if (ret &lt; INT_MIN || ret &gt; INT_MAX) { … error code 的内容吗? (或者,更具体地说,INT32_MININT32_MAX,如果你有 &lt;stdint.h&gt;。)
  • 如果您确定字符串只有数字,则不需要进行错误检查,您可以使用atoi
  • @JimDanner 但是如果号码超出范围,atoi 会怎么做?
  • Re "typedef int32_t Int32;",为什么要加这种级别的混淆???
  • @AdrianMole 显然在这种情况下行为是未定义的,stackoverflow.com/a/8871717/7840347

标签: c string string-conversion int32


【解决方案1】:

标准 C 库没有strtoint32()

我想将字符串 ... 转换为 32 位 int。
我知道 strtolstrtoimax,但它们似乎返回 64 位整数。

long strtol() 肯定满足 OP 的需求。它形成一个至少 32 位的整数。如果需要,可以使用它并进行其他测试。

#include <ctype.h>
#include <limits.h>
#include <stdint.h>
#include <stdlib.h>

// really no need for this:
// typedef int32_t Int32;

// Int32 strToIntValue(char* str) {
int32_t strToIntValue(const char* str) {
    char* end;
    errno = 0;
    long num = strtol(str, &end, 10);
    if (num == end) {
        printf("No conversion error!\n");
        return 0;
    }

    #if LONG_MAX > INT32_MAX
    if (num > INT32_MAX) {
      num = INT32_MAX;
      errno = ERANGE;
    }
    #endif 

    #if LONG_MIN < INT32_MIN
    if (num < INT32_MIN) {
      num = INT32_MIN;
      errno = ERANGE;
    }
    #endif 

    if (errno==ERANGE) {
      printf("range error!\n");
      return 0;
    }

    // Maybe check for trailing non-white space?
    while (isspace((unsigned char) *end) {
      end++;
    }
    if (*end) {
      printf("Trailing junk!\n");
      return 0;
    }

    // else {
    return (int32_t) num;
    //}
}

考虑将打印错误输出到stderr 而不是stdout

        // printf("range error!\n");
        fprintf(stderr, "range error!\n");

更多想法请见Why is there no strtoi in stdlib.h?

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2019-10-31
    • 2017-02-25
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多