You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串转整数边界场景处理:区分有效0与无效输入

字符串转整数:区分有效0与无效输入的方案

C标准库中没有直接返回整数指针来区分有效0和无效输入的现成函数,但可以基于strtol()封装一个符合需求的实现,核心是利用strtol()的endptr参数和errno来判断转换是否真正成功。

先明确strtol()的判断逻辑

strtol()本身就能区分有效0和无效输入,只是需要结合以下两点判断:

  • 如果完全没有转换任何有效数字(比如输入"junk"),endptr会指向输入字符串的起始位置(endptr == str)。
  • 如果是有效转换得到0(比如输入"0"或"000"),endptr会指向第一个非数字字符(对于纯"0"来说,endptr指向字符串末尾的\0)。
  • 另外还要处理溢出情况:如果转换结果超出long范围,errno会被设为ERANGE。

封装返回指针的自定义函数

以下是两种实现方式,根据内存管理需求选择:

方式1:使用静态变量(无需手动释放内存)

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

int* str_to_int(const char *str) {
    static int result;
    char *endptr;
    errno = 0; // 每次转换前重置errno

    long val = strtol(str, &endptr, 10);

    // 判断无效转换的几种情况
    if (endptr == str                          // 未转换任何字符
        || errno == ERANGE                     // 转换溢出
        || val > INT_MAX || val < INT_MIN) {   // 结果超出int范围
        return NULL;
    }

    // 可选:跳过末尾空白字符,确保整个字符串都是有效数字(按需开启)
    while (isspace((unsigned char)*endptr)) {
        endptr++;
    }
    if (*endptr != '\0') {
        return NULL;
    }

    result = (int)val;
    return &result;
}

方式2:动态分配内存(需调用者手动释放)

如果需要线程安全,或者不想依赖静态变量,可以用malloc分配内存:

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

int* str_to_int(const char *str) {
    char *endptr;
    errno = 0;

    long val = strtol(str, &endptr, 10);

    if (endptr == str || errno == ERANGE || val > INT_MAX || val < INT_MIN) {
        return NULL;
    }

    while (isspace((unsigned char)*endptr)) {
        endptr++;
    }
    if (*endptr != '\0') {
        return NULL;
    }

    int *result = malloc(sizeof(int));
    if (result) {
        *result = (int)val;
    }
    return result;
}

注意:使用此方式时,调用者必须在使用完返回的指针后调用free(result),避免内存泄漏。

使用示例

#include <stdio.h>

int main() {
    const char *test1 = "0";
    const char *test2 = "junk";
    const char *test3 = "123";
    const char *test4 = "0abc";

    int *res1 = str_to_int(test1);
    if (res1) printf("有效转换:%d\n", *res1); // 输出有效转换:0
    else printf("无效输入\n");

    int *res2 = str_to_int(test2);
    if (res2) printf("有效转换:%d\n", *res2);
    else printf("无效输入\n"); // 输出无效输入

    // 记得释放动态分配的内存(如果用方式2)
    // free(res1);
    // free(res2);
    return 0;
}

内容的提问来源于stack exchange,提问作者dedpunkrz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:17:18