天天看點

一緻性雜湊演算法(consistent hashing)例子+測試。

我們知道着兩個函數都提供每次輸入一行的功能。然而gets是一個不推薦使用的函數,其原因是使用gets不能指定緩沖區的長度,這樣就可能造成緩沖區的溢出。除了gets隻能操作标準輸入(stdin)外,gets和fgets還有另一個差別——gets并不将換行符讀入緩沖區中。例如:輸入”abcde\n”,那麼gets時緩沖區中隻用”abcde”而沒有”\n”。相反fgets則會完整的讀入”abcde\n”。

與此對應,puts因為一般和gets成對使用,是以puts輸出以NULL結尾的字元串後(NULL不輸出),會另外将一個換行符也輸出到标準輸出。

我們先看下面程式段:

程式段1:

char buf[BUFSIZE]; 

   while( fgets(buf,BUFSIZE,stdin)!=NULL )

  if( fputs(buf,stdout)==EOF )

      printf("output error!\n");

輸出:

一緻性雜湊演算法(consistent hashing)例子+測試。

結論:fgets和fputs結合使用正常工作

分析:輸入”abcdef\n”,fgets讀入”abcdef\n”到緩沖區,fputs将”abcdef\n”從緩沖區中取出輸出。

程式段2:

    char buf[BUFSIZE];

while( gets(buf)!=NULL )

    if( puts(buf)==EOF )

一緻性雜湊演算法(consistent hashing)例子+測試。

結論:gets和puts結合使用正常工作

分析:輸入”abcdef\n”,gets讀入”abcdef”到緩沖區(注:不讀入’\n’),puts将”abcdef”從緩沖區中取出輸出,之後又将一個換行符(‘\n’)輸出到标準輸出,即gets不讀入換行符,而puts增加換行符。

程式段3:

char buf[BUFSIZE];

    if( fputs(buf,stdout)==EOF )

一緻性雜湊演算法(consistent hashing)例子+測試。

結論:gets和fputs結合使用不能正常工作

分析:輸入”abcdef\n”,gets讀入”abcdef”到緩沖區(注:不讀入’\n’),fputs将”abcdef”從緩沖區中取出輸出(并沒有增加換行符),是以下一行的輸入會和上個輸出在同一行,即造成輸出比輸入少一個換行符。

程式段4:

while( fgets(buf,BUFSIZE,stdin)!=NULL )

一緻性雜湊演算法(consistent hashing)例子+測試。

結論:fgets和puts結合不能正常工作

分析:輸入”abcdef\n”,fgets讀入”abcdef\n”到緩沖區,puts将”abcdef\n”從緩沖區中取出輸出(這裡已經有一個換行符),之後又将一個換行符輸出,是以造成輸出比輸入多一個換行符(輸出兩個換行符)。

總結:應該盡量使用fgets和fputs,一方面是比較安全,兩一方面保持輸入輸出的原樣性,不必去記憶對換行符的處理。