0

我需要在我的项目中将 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"

4

3 回答 3

0

strtolatoi将 char 数组 ( char*then) 的地址作为转换的输入(整数可以编码为多个字符)。正确的使用方法:

a[k] = atoi (&str1[k]);
a[k] = strtol(&str1[k],NULL,16);
于 2013-09-24T08:40:35.477 回答
0

这些函数采用字符串参数,而不是单个字符。

如果您想要单个字符的值,则相当简单:

 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).

于 2013-09-24T08:40:53.347 回答
0

atoi需要一个字符串,所以任何变体char*,试试这个:

a[k] = atoi (str1+k);
于 2013-09-24T08:42:49.183 回答