2012-12-17 40 views
2

我是C新手,我試圖找出解決此問題的最佳方法。我有兩個字符串,都是char *'s。顯示C中的2個char *字符串之間的區別

它們在字符串本身內有多個\ n字符,並且它們通常長度大約爲1000個字符。我只想顯示不同的單行。通常,整個字符串中只有一個字符(或相對較小的數字)會有所不同。所以我希望能夠做到這一點,以便我可以只顯示一條已更改的行(從\ n到\ n的整個字符串)。

我不是要求任何人編寫代碼,甚至不提供代碼示例,只是從理論上講,最有效的方法是什麼?

我一直在尋找使用strtok,使用'\ n'符號作爲分隔符,然後使用strcmp比較兩個字符串,如果它們不相等,那麼我可以將該字符串添加到「old_data 「和」new_data「數組。這會是一個不好的方法來做到這一點?

任何建議將是一個巨大的幫助。

回答

1

這聽起來像你在正確的軌道上:strsep將讓你把字符串塊換成新行。有一點需要記住的是,它在原始字符串上運行,並沒有分配任何新的內存,這可能既是祝福也是詛咒。

可能最有效率的方法是查看分配的指針數組來保存你的「old_data」和「new_data」值,然後直接保存指向原始字符串的指針而不是複製字符串本身結束。只要你原來的兩根琴絃要堅持/不能從你的下面解脫出來,這可以爲你節省大量的記憶。

如果你不打算從數組中移除字符串,實現你的數組的一種天真(但有效)的方法是維護兩個狀態變量 - 一個計數和一個容量 - 並且每次都是容量的兩倍你即將溢出陣列。例如:

char **strArray = NULL; 
unsigned int capacity = 10; 
unsigned int count = 0; 

strArray = malloc(capacity * sizeof(char *)); 

/* on insert */ 
if (count == capacity) 
{ 
    capacity *= 2; 
    strArray = realloc(strArray, capacity * sizeof(char *)); 
} 

strArray[count++] = pointerIntoOriginalString; 

祝你好運!

+0

輝煌的東西,感謝您的建議! –

1

strtok()不可重入。如果你打算用strtok來做這件事,你必須依次迭代數組。我建議使用strtok_r(),它是strtok的可重入實現。

您需要擔心的另一個問題是確保您的old_data和new_data數組足夠大或可調整大小。馬特的回答顯示調整數組的一個簡單的例子,但如果你是新的C你可能只是想聲明是這樣的:

char *new_data[2000]; 
char *old_data[2000]; 

特別是因爲它聽起來像你有多少行是個好主意在你的緩衝區。

+0

我看到,偉大的觀點,thx爲輸入。 strtok_r()函數看起來可能有用。 –

相關問題