如何从两个char
数组中添加两个数值?
示例:char array1[2]="12", array2[2]="98";
我想添加array1
和array2
的值。
谢谢。
答案 0 :(得分:4)
警告:
char array1[2]="12", array2[2]="98";
大小2不足以保存空终止符,必须为3
一种更安全的方法是让编译器自行决定尺寸:
char array1[]="12", array2[]="98";
我想从两个字符串数组中添加两个数值。
有几种方法,使用atoi
的安全性较低,因为即使得出的数字都是无效的,如果数字中包含{{ 1}}(您没有说它们是否可以包含双精度等)。
示例:
strtol
编译和执行:
long
请注意,程序不会指示#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main()
{
char array1[]="12", array2[]="98";
long l1, l2;
char * endp;
errno = 0;
l1 = strtol(array1, &endp, 10);
if ((errno != 0) || (*array1 == 0) || (*endp != 0)) {
printf("not (only) a valid long in %s\n", array1);
return -1;
}
l2 = strtol(array2, &endp, 10);
if ((errno != 0) || (*array2 == 0) || (*endp != 0)) {
printf("not (only) a valid long in %s\n", array2);
return -1;
}
printf("%ld + %ld = %ld\n", l1, l2, l1+l2);
}
出现错误,而是指示pi@raspberrypi:/tmp $ gcc -pedantic -Wextra s.c
pi@raspberrypi:/tmp $ ./a.out
12 + 98 = 110
出现错误,如果您也想拒绝" 12"
,则可以执行以下操作:
"12 "
,与 array1 相同。 isdigit 在" 12"
根据您的评论
一个简单的方法对我有好处
如果您完全确定,该数组包含 int 的有效外部表示形式,则可以使用 atoi ( atol 表示 long 等)。 atoi 还会在预期的 int
前绕过空格if ((errno != 0) || !isdigit(*array1) || (*endp != 0))
编译和执行:
#include <ctype.h>
但再次警告,#include <stdio.h>
#include <stdlib.h>
int main()
{
char array1[]="12", array2[]="98";
printf("%s + %s = %d\n", array1, array2, atoi(array1) + atoi(array2));
}
静默返回0,就像您执行pi@raspberrypi:/tmp $ gcc -pedantic -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
12 + 98 = 110
strtod 系列的另一种选择是 sscanf ,它比 atoi 系列更安全,因为它表明您是否阅读了数字的一部分,是否存在溢出。例如,如果仅使用atoi("aze")
,则不知道读取的整数后面是否有内容,但是可以使用atoi("0")
仍然检查 sscanf 返回1(如果后面有内容,数字 sscanf 返回2):
"%d"
编译和执行:
"%d%c"
与其他功能一样,预期编号之前的空格也会被绕过。