atoi()用于二维数组

时间:2016-12-16 09:49:59

标签: c 2d atoi

如果我有一个2D字符数组:

char tempoArray[2][3]={{1,2,3}, {4,5,6}};

如何使用atoi()将每个整行转换为一个整数值,以便

printf("val1 %d\nval2 %d", val1, val2);

会给我:

  

123

     

456

2 个答案:

答案 0 :(得分:2)

如果您确实坚持使用atoi,则必须先将每个数字转换为char(例如,添加'0')。你也必须零终止字符串。

我建议在这里使用算术。只需循环遍历数组并使用转换:x = 10*x + array[i],将x初始化为0

答案 1 :(得分:2)

写作时

char tempoArray[2][3]={{1,2,3}, {4,5,6}};

您的数组包含小整数值,例如123

atoi对字符串进行操作,字符串是字符数组。例如,字符串

"123"

包含三个字符'1''2''3',以及一个尾随空字符'\0'

但数字字符'1''2''3' 的值为1,2和3!如果您还不知道这一点,我建议您运行这个小程序:

#include <stdio.h>

int main()
{
    printf("character '1' has value %d, number 1 has value %d\n", '1', 1);
    printf("character '2' has value %d, number 2 has value %d\n", '2', 2);
    printf("character '3' has value %d, number 3 has value %d\n", '3', 3);
}

由于数组的行是而不是字符串(它们不是有用字符值的数组,并且它们不是以空值终止的),因此无法简单地调用atoi()在他们身上。

由于数组已包含整数值,因此最直接的做法是自己进行算术运算,如下所示:

int i, j;
int val;

for(i = 0; i < 2; i++) {
    val = 0;
    for(j = 0; j < 3; j++) {
        val = 10 * val + tempoArray[i][j];
    }
    printf("val: %d\n", val);
}

如果你真的,真的想调用atoi,你必须从每个数组行构造一个实际的字符串,如下所示:

char tmpstring[4];

for(i = 0; i < 2; i++) {
    for(j = 0; j < 3; j++) {
        tmpstring[j] = tempoArray[i][j] + 48;  /* +48 to convert dig to char */
    }
    tmpstring[j] = '\0';

    val = atoi(tmpstring);

    printf("val: %d\n", val);
}

正如您所看到的,这是更多的工作,更令人困惑。

还有一点。为了弄清楚正在进行什么样的转换,我写了

        tmpstring[j] = tempoArray[i][j] + 48;  /* +48 to convert dig to char */

但是在实际代码中我永远不会写这个,因为那个&#34;魔术数字&#34; 48太模糊了。在实际代码中,我总是写

        tmpstring[j] = tempoArray[i][j] + '0';

根据定义,字符'0'的值恰好是要将数字1转换为字符'1',将数字2转换为字符'2'等的正确值。