簡體   English   中英

比較字符串 C(套接字編程)

[英]Comparing Strings C (Socket Programming)

我正在制作一個游戲,其中答案存儲在client_challenges->answer中,而客戶端以以下格式輸入答案(存儲在緩沖區中):

A: myanswer

如果答案從字母 A 開始,那么我需要將 myanswer 與預先存儲的答案進行比較。 使用下面的代碼,我得到了正確的緩沖區和 ans 長度,但是如果我打印出我的存儲數組和答案數組,結果會有所不同。 例如,如果我輸入 A: color,我的商店會給出colo 而不是 color 但是,store-2 在某些情況下有效。 我怎樣才能解決這個問題?

if (buffer[0] == 'A')
{
        printf("ans len %ld, buff len %ld\n",strlen(client_challenges->answer,(strlen(buffer)-4));
        if(strlen(client_challenges->answer) == (strlen(buffer)-4))
        {
            char store[100];
            for (int i = 1; i<= strlen(client_challenges->answer);i++)
            {
                store[i-1]=buffer[2+i];
            }
            store[strlen(store)-2] = '\0';
            //store[strlen(client_challenges->answer)+1]='\0';
            printf("Buffer: <%s>\n", buffer);
            printf("STORE: %s\n",store);
            printf("ANSWER: %s\n",client_challenges->answer);
            if(strcmp(store,client_challenges->answer)==0)
               {
                send(file_descriptor, correct, strlen(correct), 0);
               }
       }
}

示例:客戶輸入

A: Advancement

ans len 11, buff len 11但是當我打印出 store 時,它是Advancemen而答案是Advancement 但是,在我之前的嘗試中,答案很快,我輸入了“很快”。 那時它奏效了。

雖然我無法用給定的輸入確定這個錯誤的確切原因,但我可以分享我關於如何有效地找到正確位置的經驗。

  1. 始終驗證您的輸入。

永遠不要相信輸入。 您只打印了輸入的長度,內容是什么。 您最好檢查每個字節(最好是十六進制)以發現不可打印的字符。 一些 IDE 提供集成調試器來顯示緩沖區內容。

  1. 使用定義、常量、一些人類可讀的東西而不是 4 或 2。這讓生活更輕松例如

     /* what is 4 here */ strlen(buffer)-4

本來應該:

    /* remove 'A: ' (A, colon, and white space, and I do not know what is 4th item */
    strlen(buffer) - USER_ADDED_HEADERS
  1. 更加熟悉 C 庫

您實際上不需要在這里存儲數組。 C 提供strncmp function 來比較兩個最大為“n”的字符串或 memcmp 來比較兩個緩沖區。 這將節省復制操作(cpu 周期)和堆棧 memory。

您的代碼片段的更清晰版本(沒有錯誤檢查)可以寫成:

if (buffer[0] == 'A') {
    /* verify input here */
    /* #define ANSWER_START 4 // I do not know what the 4 is */

    /* compare lengths here if they are not equal return sth accordingly */

    /* supplied answer correct? */
    if (memcmp(client_challenges->answer, 
                buffer + ANSWER_START, 
                strlen(client_challenges->answer)) == 0) {
        /* do whatever you want here */
    }
}
  1. 一致的代碼格式

代碼格式確實很重要。 在縮進、花括號、制表符與空格、原子前后的空格等方面保持一致。您不必堅持一種格式,但必須保持一致。

  1. 使用調試器

調試器是你最好的朋友。 了解它。 調試器可以很容易地識別此錯誤的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM