atoi() 用于二维数组

atoi() for 2 dimensional array

如果我有一个二维字符数组:

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

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

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

会给我:

123

456

如果你真的坚持使用atoi,你必须首先将每个数字转换为char(例如通过添加'0')。您还必须以零终止字符串。

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

写的时候

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

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

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

"123"

由三个字符 '1''2''3' 加上尾随的空字符 '[=24=]'.

组成

但是数字字符 '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] = '[=14=]';

    val = atoi(tmpstring);

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

如您所见,这工作量更大,也更令人困惑。

还有一点。为了弄清楚发生了什么类型的转换,我写了

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

但在实际代码中我永远不会写这个,因为 "magic number" 48 太晦涩了。在实际代码中,我总是写

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

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