如果我有一个2D字符数组:
char tempoArray[2][3]={{1,2,3}, {4,5,6}};
如何使用atoi()
将每个整行转换为一个整数值,以便
printf("val1 %d\nval2 %d", val1, val2);
会给我:
123
456
答案 0 :(得分:2)
如果您确实坚持使用atoi
,则必须先将每个数字转换为char
(例如,添加'0'
)。你也必须零终止字符串。
我建议在这里使用算术。只需循环遍历数组并使用转换:x = 10*x + array[i]
,将x
初始化为0
。
答案 1 :(得分:2)
写作时
char tempoArray[2][3]={{1,2,3}, {4,5,6}};
您的数组包含小整数值,例如1
,2
和3
。
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'
等的正确值。