[英]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
。 但是,在我之前的嘗試中,答案很快,我輸入了“很快”。 那時它奏效了。
雖然我無法用給定的輸入確定這個錯誤的確切原因,但我可以分享我關於如何有效地找到正確位置的經驗。
永遠不要相信輸入。 您只打印了輸入的長度,內容是什么。 您最好檢查每個字節(最好是十六進制)以發現不可打印的字符。 一些 IDE 提供集成調試器來顯示緩沖區內容。
使用定義、常量、一些人類可讀的東西而不是 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
您實際上不需要在這里存儲數組。 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 */
}
}
代碼格式確實很重要。 在縮進、花括號、制表符與空格、原子前后的空格等方面保持一致。您不必堅持一種格式,但必須保持一致。
調試器是你最好的朋友。 了解它。 調試器可以很容易地識別此錯誤的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.