2013-02-01 108 views
0

我不知道如何處理字符串的工作在C:STRNCMP不匹配正確

這裏是我的服務器的一部分: 斷裂不會被調用,即使我通過telnet供應字符「/」。

理想情況下,這將緩衝字符串稱爲get通過添加字符串ch到它一遍又一遍,直到它到達某個字符,或者更好,但字符串(但現在寫它應該與一個字符,但我很想知道如何用一個字符串來做到這一點,所以我可以設計一個使用CR + LF作爲分隔符的協議)。

char ch; 
    int index = 0; 
    char get[1024]; 
    const char str[] = "/"; 

    if (read(client, &ch, 1) < 0) 
    { 
     perror("read"); 

     get[index] = ch; 
     index++; 

     int compareResult = strncmp(str, &ch, 5); 

     if(compareResult == 0){ 
      index = 0; 
      close(client); 
      printf("server responded, connection closed"); 
      break; 
     } 
    } 

    //if (write(client, &ch, 1) < 0) { perror("write"); break; } 

    printf("got stuff"); 

爲什麼它沒有達到

printf("server responded, connection closed"); 

線?

服務器全碼:http://pastebin.com/j5tX3TEx

+0

呃,什麼是「str」? –

+0

爲什麼你比較兩個單個字符作爲字符串,當'str'只有一個字符長,'&ch'只能是一個字符時,爲什麼你有5個到strncmp? – Art

回答

3

此:

int compareResult = strncmp(str, &ch, 5); 

調用未定義的行爲。您將&ch,單個char的地址傳遞給字符串指針的函數。因此,它會查看從地址&ch開始的最多5個字符,當然這只是一個數據的字符。

您的整個讀取邏輯非常奇怪,它應該一次執行較大的讀取而不是一個字符。

+0

第一個c程序!你能寫一些示例代碼來定義最佳實踐嗎? – stackOverFlew

2

int compareResult = strncmp(str, &ch, 5); 

是不正確的

CH是一個字符,但你比較5個字符。第二個參數必須是一個字符串而不是char。

,如果它是一個錯字,你的意思get,那麼你需要\ 0您才能使用get作爲參數收到的最後一個字符 終止後的字符串。或者使用memcmp來比較字節,而不管它們是否是字符串 。

0

試試看看。好像你比較CHAR(STR)的陣列爲char(CH)

if(ch == '/'){ 
    index = 0; 
    close(client); 
    printf("server responded, connection closed"); 
    break; 
} 
0

你這樣做,而不是:

if(ch == '/'){ 
     index = 0; 
     close(client); 
     printf("server responded, connection closed"); 
     break; 
} 

這也比使用函數更快(如strncmp

0
read(client, &ch, 1) < 0 

爲什麼< 0?一切似乎都在你的代碼中完成,而讀取則返回讀取的字節數。