如何将单个字符型数字转为整数?为何atoi(c[i])无法转换?
问题原因与解决方案
为什么atoi(c[i])无法转换单个字符?
atoi函数的参数要求是指向C风格字符串的指针(const char*),它会从指针指向的位置开始读取连续字符,直到遇到非数字字符,再将这段字符串转为整数。
而你代码里的c[i]是单个char类型字符,把它传给atoi时,编译器会把这个字符的ASCII值当作内存地址处理——这不是合法的字符串指针,会直接触发未定义行为(比如程序崩溃、输出垃圾值),完全达不到转换单个字符数字的目的。
正确的转换方法
方法1:利用ASCII码差值(最常用、高效)
字符数字('0'到'9')的ASCII码是连续的,'0'的ASCII值为48,单个字符数字减去'0'就能得到对应整数:
ar[i] = c[i] - '0';
方法2:构造临时字符串再用atoi
如果一定要用atoi,需要把单个字符包装成合法的C风格字符串(必须以'\0'结尾):
char temp[2] = {c[i], '\0'}; ar[i] = atoi(temp);
修正后的完整代码
#include <bits/stdc++.h> using namespace std; int main() { char c[100]; int ar[50]; cin >> c; int len = strlen(c); // 将strlen移到循环外,避免重复计算 for (int i = 0; i < len; i++) { if (c[i] >= '0' && c[i] <= '9') { ar[i] = c[i] - '0'; // 使用ASCII差值完成转换 } } // 可选:验证转换结果 for (int i = 0; i < len; i++) { if (isdigit(c[i])) { cout << ar[i] << " "; } } return 0; }
内容的提问来源于stack exchange,提问作者Mohonta
相关产品推荐
相关产品推荐

