将两个char数组的值相加

时间:2019-03-10 13:11:56

标签: c arrays

如何从两个char数组中添加两个数值?

示例:char array1[2]="12", array2[2]="98";

我想添加array1array2的值。

谢谢。

1 个答案:

答案 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"

与其他功能一样,预期编号之前的空格也会被绕过。