2014-11-14 61 views
0

我试着添加两个字符数组或整数数组。 只有当数组中的值为一位时,它才能正常工作。 如果其中一个或两个数组都有两位数的数字,我得到了错误的答案。添加两个数组

假设

//n = 3 
a1[n] = "1 2 3" 
a2[n] = "4 5 6" 

我用while循环此外...

while(sizeofarray > i) 
{ 
    result[i]= atoi(&12[i]) + atoi(&a2[i]); 
    i++; 
} 

,我得到了正确的答案。

但如果

a1[n] = "1 10 20" 
a2[n] = "4 5 6" 

相加的结果将是错误的。

什么是解决此问题的正确代码。 或者至少是这个想法。

+0

请显示您的代码如何计算整个事情 – Rizier123 2014-11-14 17:01:58

+0

必须在操作之前进行归一化。 – BLUEPIXY 2014-11-14 17:04:14

+0

'{1,10,20}'意味着'11020'或'1 * 100 + 10 * 10 + 20 * 1'?你的意思是吗? – BLUEPIXY 2014-11-14 17:05:48

回答

1

C字符串的每个“元素”是单个字符,而不是“数字”,意思是“10”是一个数字。例如,这些声明是等价的:

char a1[] = "1 10 20"; 
char a1[] = {'1', ' ', '1', '0', ' ', '2', '0', 0}; 
char a1[] = {49, 32, 49, 48, 32, 50, 32, 0}; 
/* The 0 at the end is the NUL terminator, which tells the C library 
    that the string ends at that point */ 

如果创建a1a2为数组,您可以添加相应的元素。

int a1[] = {1, 10, 20}; 
int a2[] = {4, 5, 6}; 

但我假设你有一个需要分析它们的字符串,你不能只是直接创建阵列,比如从标准输入(通常是键盘)读取数据或文件。我看到您正在使用atoi函数将字符串转换为数字。但atoi函数不返回它吞噬了多少数字。因此i++;将跳过太少数字,除非添加1位数字。此外,使用一个变量(i)将索引保存到两个字符串中,只有当每个字符串中的数字始于相同索引时,即每个元素具有相同数量的数字时才起作用。

要解决这个问题,你需要做两件事情:

  1. 使用单独的指针到每个a1a2阵列。每个指针将指向已经读取的数组部分。这样,在从每个字符串读取两个整数后,一个指针会指向“10”的末尾,另一个指向“5”的末尾。
  2. 使用strtol function,它返回一个指向函数已读取的字符串部分末尾的指针。然后,您可以使用此指针跳过数字,然后(手动)跳过过去的空格,直到碰到下一个数字(使用isdigit)或NUL终止符。
0

您有一个字符数组,因此,在字符串内编码的数字不会被识别为数字。这会让程序的副作用无法在添加例程中找到并对齐小数位。

如果您没有手动对齐小数位,那么“10”+“3”会使某些行变为“40”。使用整数数组可以解决问题,因为数学例程将自动为所有数学类型解释小数位数对齐。

要解决此问题,您需要执行例行

  1. 收集所有的数字将第一个数字。
  2. 收集第二个数字的所有数字。
  3. (假设你不处理小数位)向后执行加法操作(从上面的那个位置开始),如果有必要的话。