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

时间:2012-04-18 07:02:04

标签: c arrays char int

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

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

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

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

5 个答案:

答案 0 :(得分:62)

我个人不喜欢atoi功能。我建议sscanf

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

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

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

修改 我刚刚在网站上找到了这个精彩的question,它解释并比较了3种不同的方法 - atoisscanfstrtol。此外,还有一个更详细的洞察sscanf(实际上,*scanf函数的整个系列)。

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

答案 1 :(得分:7)

为什么不使用atoi?例如:

char myarray[4] = {'-','1','2','3'};

int i = atoi(myarray);

printf("%d\n", i);

按照预期给我:

-123

更新:为什么不 - 字符数组不以空值终止。卫生署!

答案 2 :(得分:3)

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

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'-'之外,要处理杂散字符,唯一的诀窍是明智地选择何时开始收集数字以及何时停止。

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

使用它的一个简短例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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%防弹,而是绝大部分时间都可以工作并提供额外的转换灵活性,而无需atoi或{{所需的初始解析或转换为字符串1}}等等。

答案 3 :(得分:2)

因此,我们的想法是将字符数(用单引号,例如&#39; 8&#39;)转换为整数表达式。例如char c =&#39; 8&#39 ;; int i = c - &#39; 0&#39; //会产生整数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

答案 4 :(得分:0)

这不是问题的要问,但我使用@Rich Drummond的答案来从stdin读入的char数组,该数组以null结尾。

char *buff;
size_t buff_size = 100;
int choice;
do{
    buff = (char *)malloc(buff_size *sizeof(char));
    getline(&buff, &buff_size, stdin);
    choice = atoi(buff);
    free(buff);
                    
}while((choice<1)&&(choice>9));