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}};
您的数组包含小整数值,例如 1
、2
和 3
。
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'
的正确值等
如果我有一个二维字符数组:
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}};
您的数组包含小整数值,例如 1
、2
和 3
。
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'
的正确值等