C语言如何将字符串指针指定位置的字符转换为int类型
问题分析
原代码存在语法错误,无法正常运行:
atoi(s[0])的调用不符合atoi函数的入参要求:atoi需要传入C风格字符串(const char*类型的指针),而s[0]是单个char类型的字符值,直接传入会把字符的ASCII值当做内存地址访问,大概率触发段错误或者得到异常结果。
最高效实现方案
利用ASCII编码中数字字符连续排列的特性,直接做减法运算即可,不需要调用任何库函数,时间复杂度为O(1),无额外开销,是当前需求下的最优解:
#include <stdio.h> int main() { char* s = "123456"; // 可先增加合法性判断,避免非数字输入得到错误结果 int number = (s[0] >= '0' && s[0] <= '9') ? (s[0] - '0') : -1; printf("test %d",number); return 0; }
实现原理
ASCII编码规则中,'0'到'9'的编码值是连续递增的,'0'的编码值为48、'1'为49,以此类推,单个数字字符减去'0'的编码值,刚好可以得到对应的整数值。
如果非要用atoi实现也可以,但会有额外的函数调用、字符串构造开销,效率远低于上述方案,参考写法:
char tmp[2] = {s[0], '\0'}; int number = atoi(tmp);
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

