我需要在我的项目中将 char 格式的字符串元素转换为 int 格式的数组。我使用以下函数,但编译后出现错误:
a[k] = atoi (str1[k]);
a[k] = strtol(str1[k],NULL,16);
K 作为计数器。
error: #167: argument of type "char" is incompatible with parameter of type "const char *restrict"
我需要在我的项目中将 char 格式的字符串元素转换为 int 格式的数组。我使用以下函数,但编译后出现错误:
a[k] = atoi (str1[k]);
a[k] = strtol(str1[k],NULL,16);
K 作为计数器。
error: #167: argument of type "char" is incompatible with parameter of type "const char *restrict"
这些函数采用字符串参数,而不是单个字符。
如果您想要单个字符的值,则相当简单:
a[k] = str1[k] - '0';
如果str[k]
是数字“7”,则 的整数值为a[k]
7。
这使用 '0' 字符的值,假设执行字符集给出 '0' - '9' 连续值。这是一个安全的假设,因为它是由 ISO C99 草案的(例如)5.2.1.3 规定的:
在源和执行基本字符集中,上述十进制数字列表中 0 之后的每个字符的值都应比前一个字符的值大 1。
即,如果'0' == 48,那么'1' == 49,等等。
如果您只想要以字符串 at开头的整数的值str[k]
,请使用运算符的地址:
a[k] = strtol(&str1[k],NULL,16);
如果您需要使用十六进制数字,您可以假设您的执行字符集也按顺序将“a”编码为“f”,这是一个非常安全的假设(ASCII 和 unicode 以及所有其他常见编码都这样做);然后,您可以使用一个函数来测试值的范围并根据它进行分配(如果在“0”和“9”之间,减去“0”,如果在“a”和“f”之间,减去“a”)。但如果你真的很偏执,你可以创建一个查找表:
char hexDigitLookup[256]; // The normal range of a char.
memset(hexDigitLookup, -1, 256);
hexDigitLookup['0'] = 0;
hexDigitLookup['1'] = 1;
hexDigitLookup['2'] = 2;
hexDigitLookup['3'] = 3;
hexDigitLookup['4'] = 4;
hexDigitLookup['5'] = 5;
hexDigitLookup['6'] = 6;
hexDigitLookup['7'] = 7;
hexDigitLookup['8'] = 8;
hexDigitLookup['9'] = 9;
hexDigitLookup['a'] = 10;
hexDigitLookup['b'] = 11;
hexDigitLookup['c'] = 12;
hexDigitLookup['d'] = 13;
hexDigitLookup['e'] = 14;
hexDigitLookup['f'] = 15;
因此,a[k] = hexDigitLookup[str1[k]]
如果是十六进制数字,则将产生正确的值str[k]
,否则将产生 -1,无论执行字符集的布局如何。您应该首先检查它str[k]
是否不小于 0,当然,在解析例如 unicode 时可能是它。你可以改为投射到(unsigned char)
.
atoi
需要一个字符串,所以任何变体char*
,试试这个:
a[k] = atoi (str1+k);