将char数组转换为C中的int数

我想转换一个char数组[],如:

char myarray[4] = {'-','1','2','3'}; //where the - means it is negative 

所以它应该是整数:-1234使用C中的 标准库。 我找不到任何优雅的方式来做到这一点。

我可以肯定附加’\ 0’。

我个人不喜欢atoifunction。 我建议sscanf

 char myarray[5] = {'-', '1', '2', '3', '\0'}; int i; sscanf(myarray, "%d", &i); 

这是非常标准的,它在stdio.h库中:)

在我看来,它允许你比atoi更自由,你的数字字符串的任意格式,并可能还允许最后的非数字字符。

编辑我刚刚在网站上找到了这个奇妙的问题 ,解释并比较了3种不同的方法 – atoisscanfstrtol 。 此外,还有一个更详细的sscanf洞察(实际上,整个*scanf函数系列)。

EDIT2看起来不仅仅是我个人不喜欢atoifunction。 这是一个答案的链接 ,解释了atoi函数已弃用,不应在较新的代码中使用。

为什么不使用atoi? 例如:

 char myarray[4] = {'-','1','2','3'}; int i = atoi(myarray); printf("%d\n", i); 

按照预期给我:

 -123 

更新:为什么不 – 字符数组不以null结尾。 卫生署!

因此,我们的想法是将字符数(单引号,例如’8’)转换为整数表达式。 例如char c =’8′; int i = c – ‘0’//将产生整数8; 并通过908 = 9 * 100 + 0 * 10 + 8的原理总结所有转换的数字,这是在循环中完成的。

 char t[5] = {'-', '9', '0', '8', '\0'}; //Should be terminated properly. int s = 1; int i = -1; int res = 0; if (c[0] == '-') { s = -1; i = 0; } while (c[++i] != '\0') { //iterate until the array end res = res*10 + (c[i] - '0'); //generating the integer according to read parsed numbers. } res = res*s; //answer: -908 

如果不将数组转换为字符串,处理字符数组本身并不难。 特别是在已知或可以容易地找到字符arrays的长度的情况下。 对于字符数组,必须在与数组定义相同的范围内确定长度,例如:

 size_t len sizeof myarray/sizeof *myarray; 

对于字符串,您当然可以使用strlen

在已知长度的情况下,无论是字符数组还是字符串,都可以将字符值转换为具有类似于以下内容的短函数:

 /* convert character array to integer */ int char2int (char *array, size_t n) { int number = 0; int mult = 1; n = (int)n < 0 ? -n : n; /* quick absolute value check */ /* for each character in array */ while (n--) { /* if not digit or '-', check if number > 0, break or continue */ if ((array[n] < '0' || array[n] > '9') && array[n] != '-') { if (number) break; else continue; } if (array[n] == '-') { /* if '-' if number, negate, break */ if (number) { number = -number; break; } } else { /* convert digit to numeric value */ number += (array[n] - '0') * mult; mult *= 10; } } return number; } 

以上只是标准的char到int转换方法,其中包含一些附加条件。 要处理杂散字符,除了digits'-' ,唯一的技巧是做出关于何时开始收集数字和何时停止的明智选择。

如果您在遇到第一个digit时开始收集转换digit ,那么当您遇到第一个'-' non-digit时,转换就会结束。 当对诸如(例如file_0127.txt )之类的索引感兴趣时,这使得转换更加方便。

它的一个简短例子:

 #include  #include  #include  int char2int (char *array, size_t n); int main (void) { char myarray[4] = {'-','1','2','3'}; char *string = "some-goofy-string-with-123-inside"; char *fname = "file-0123.txt"; size_t mlen = sizeof myarray/sizeof *myarray; size_t slen = strlen (string); size_t flen = strlen (fname); printf ("\n myarray[4] = {'-','1','2','3'};\n\n"); printf (" char2int (myarray, mlen): %d\n\n", char2int (myarray, mlen)); printf (" string = \"some-goofy-string-with-123-inside\";\n\n"); printf (" char2int (string, slen) : %d\n\n", char2int (string, slen)); printf (" fname = \"file-0123.txt\";\n\n"); printf (" char2int (fname, flen) : %d\n\n", char2int (fname, flen)); return 0; } 

注意:当面对'-'分隔文件索引(或类似)时,由您来取消结果。 (例如file-0123.txtfile-0123.txt相比,第一个返回-123而第二个123返回)。

示例输出

 $ ./bin/atoic_array myarray[4] = {'-','1','2','3'}; char2int (myarray, mlen): -123 string = "some-goofy-string-with-123-inside"; char2int (string, slen) : -123 fname = "file-0123.txt"; char2int (fname, flen) : -123 

注意:总会出现可能导致问题的拐角情况等。 这并非在所有字符集等中都是100%防弹的,而是绝大部分时间工作并提供额外的转换灵活性,而无需初始解析或转换为atoistrtol等所需的字符串。