我需要将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"
答案 0 :(得分:0)
strtol和atoi将char数组的地址(char*
然后)作为转换输入(整数可以在多个字符上编码)。
正确的使用方法:
a[k] = atoi (&str1[k]);
a[k] = strtol(&str1[k],NULL,16);
答案 1 :(得分:0)
这些函数采用字符串参数,而不是单个字符。
如果你想要个别角色的价值,那就很简单了:
a[k] = str1[k] - '0';
如果str[k]
是数字' 7',a[k]
的整数值将为7。
这使用' 0'的值。字符,假设执行字符集给出了' 0' 0 - ' 9'连续值。这是一个安全的假设,因为它由(例如)ISO C99草案的5.2.1.3规定:
在源和执行基本字符集中,值都是 上面的十进制数字列表中的每个字符后面的0应为 比前一个值大一个。
即,如果' 0' == 48,然后' 1' == 49,等等。
如果您只想在str[k]
的字符串中使用开始的整数值,请使用运算符的地址:
a[k] = strtol(&str1[k],NULL,16);
如果你需要使用十六进制数字,你可以假设你的执行字符集也编码了一个' a'到了' f'顺序,这是一个非常安全的假设(ASCII和unicode以及其他所有常见编码都这样做);然后你可以使用一个测试值范围的函数并根据它进行分配(如果在' 0'和''之间减去' 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)
。
答案 2 :(得分:0)
atoi
需要一个字符串,因此任何char*
的变体都会尝试这个:
a[k] = atoi (str1+k);