2011-03-18 176 views
3

我有兩個字符緩衝區,我試圖比較它們的部分。我有一個奇怪的問題。我有以下代碼:字符緩衝區比較

char buffer1[50], buffer2[60]; 
// Get buffer1 and buffer2 from the network by reading sockets 
for(int i = 0; i < 20; i++) 
{ 
    if(buffer1[15+i] != buffer2[25+i]) 
    { 
     printf("%c", buffer1[15+i]); 
     printf("%c", buffer2[25+i]); 
     printf("%02x", (unsigned char)buffer1[15+i]); 
     printf("%02x", (unsigned char)buffer2[25+i]); 
     break; 
    } 
} 

上面的代碼是我的實際代碼的簡化版本,我沒有複製粘貼在這裏,因爲它太長。爲了防止這可能會有所幫助,我通過讀取套接字來在網絡上獲得這兩個緩衝區。

即使兩個緩衝區都相同,問題仍然是循環中斷。爲了檢查緩衝區中的內容,我在if語句中添加了兩條打印語句。奇怪的是,printf語句爲%c和%02x打印了相同的值,但比較失敗並且循環中斷。

+2

出於普遍的興趣 - 你添加的演員是否實際上改變了任何東西? – configurator 2011-03-18 01:48:27

+0

我在這裏找不到任何東西;可能會添加一些代碼以將'buffer1'和'buffer2'轉儲到磁盤,將它們存儲到'/ tmp/1'和'/ tmp/2'中,並分解出'od -x'或'xxd'來試圖找到問題? – sarnold 2011-03-18 01:49:16

+0

你怎麼知道中斷退出循環?我退出時的價值是什麼?爲什麼不使用memcmp? – Sean 2011-03-18 01:50:19

回答

3

(免責聲明:我不是一個C/++專家)

在我看來,就像當你看着它的數據發生了變化。想到兩個簡單的問題:

  1. 如果你在調試器中運行它,然後循環一遍,那麼它是否仍然會發生?如果沒有,那麼我強烈懷疑我的第二個問題會引導你回答問題。
  2. 讀取操作是異步的嗎?當你進入for循環時,數據似乎還在被讀取,這意味着你沒有等待讀取完成。
+0

我認爲你的第二點是問題。我發佈的代碼中的緩衝區,我通過閱讀網絡直接獲取它們。我從這些緩衝區複製到臨時緩衝區並進行比較。並解決了這個問題。 – Romonov 2011-03-18 01:59:54

+0

非常好。確保在嘗試訪問數據之前始終等待操作完成;通常有一種方法可以讓你等待它完成,或者一個回調你可以註冊,一旦完成就會發生。 – configurator 2011-03-18 02:03:15

+0

btw讀取操作不是異步的。插座被阻塞。所以我想這個問題是由於內核級別的操作系統對緩衝區的緩慢管理造成的。 – Romonov 2011-03-18 02:07:40

2

我看到的唯一一件事是計時問題。如果它們在if語句中不相同,並且在打印語句中它們相同,則有人在兩者之間進行了更改。