字符串转整数边界场景处理:区分有效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
相关产品推荐
相关产品推荐

