2016-07-31 82 views
1

的是否使用STRNCMP和memcmp

if(strncmp(buf, buf2, 7) == 0) 

做同樣的事情,

if(memcmp(buf, buf2, 7) == 0) 

bufbuf2是的char *數組或相似。

我打算把這個附加到另一個問題上,但後來決定也許最好單獨發佈它。據推測,答案要麼是微不足道的「是」,要麼不是那麼有什麼區別?

(我發現來自在線文檔這些功能,但不知道strncmp因爲文檔略有不清楚。)

回答

1

在C和C++字符串的結束由一個字節表示值爲0。 函數memcmp不關心strig的結束,但在任何情況下都會比較指定的字節數。

與此相反,函數strncmp將在值爲0的字節處停止,即使尚未達到要傳遞的比較字節數。

+0

啊當然是啊 - 應該注意到,在我的問題 – user3728501

+1

除了該方法的功能,memcmp()的實現可能實際上是不同的,因爲它可能被設計爲在整個單詞方面工作,而strncmp()很可能只用字節讀取來實現。如果性能問題,memcmp()可能會更快。 – MoDJ

+0

謝謝,這也是有用的知道 – user3728501

2

strcmp()類似,strncmp()用於比較字符串,因此它停止比較何時在至少一個參數中找到字符串終止符。過去的任何差異都不會影響結果。 strncmp()不同之處在於,如果它在那之前沒有遇到終止符,它也將停止在指定的字節數之後進行比較。另一方面,

memcmp()用於比較隨機存儲器塊。它會比較每個塊的指定字節數,直到找到差值,而不管字節的值如何。也就是說,它不停止在字符串終止符處。

+0

兩個很好的答案謝謝 – user3728501

0

strncmp()memcmp()之間的主要區別在於,第一是明智至(停止在)'\0'其中最新的是沒有的。如果來自bufbuf2的前7個字節的內存中不包含'\0',則行爲是相同的。

請看下面的例子:

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char buf[] = "123\0 12"; 
    char buf2[] = "123\0 34"; 

    printf("strncmp(): %d\n", strncmp(buf, buf2, 7)); 
    printf("memcmp(): %d\n", memcmp(buf, buf2, 7)); 

    return 0; 
} 

這將輸出:

strncmp(): 0 
memcmp(): -2 

因爲strncmp()將在buf[3],停在那裏會找到一個'\0',其中memcmp()將繼續,直到所有7個字節進行比較。