2014-11-14 101 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. (假設你不處理小數位)向後執行加法操作(從上面的那個位置開始),如果有必要的話。