【问题标题】:Comparing Strings C (Socket Programming)比较字符串 C(套接字编程)
【发布时间】:2020-03-13 06:08:24
【问题描述】:

我正在制作一个游戏,其中答案存储在 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 但是当我打印出商店时,它是Advancemen,而答案是Advancement。但是,在我之前的尝试中,答案很快,我输入了“很快”。那时它起作用了。

【问题讨论】:

  • 我不知道您是如何填充缓冲区的。但也许有时你在结尾有一条新线,有时你没有?也许你需要知道你之前的最后一个字符是什么store[strlen(store)-2] = '\0';
  • @JerryJeremiah 我正在使用这个:valread = read(file_descriptor, buffer, 1024);在命令行上,我只需输入 A: color 然后在所有情况下都按回车键。然后服务器会告诉我我是否错了。
  • 不确定这是如何编译的,第一个 strlen 后缺少 ):printf("ans len %ld, buff len %ld\n",strlen(client_challenges->answer),(strlen (缓冲区)-4));
  • 我正在程序中生成随机单词。这次我尝试了“很多”。缓冲区给了我“
  • 建议的 printf() 包含标记字符 &lt;&gt;"&lt;A: Many" 报告似乎是错误的。 store 带有哨兵的输出会有所帮助,而不仅仅是 "Many?"。建议在if (buffer[0] == 'A') 之前,代码使用buffer[strcspn(buffer, "\r\n")] = 0; 来消除行尾并相应地调整偏移量。祝你好运。

标签: c string algorithm sockets strlen


【解决方案1】:

虽然我无法通过给定的输入确定此错误的确切原因,但我可以分享我关于如何有效地找到正确位置的经验。

  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 函数来比较两个最大大小为“n”的字符串或memcmp 来比较两个缓冲区。这将节省复制操作(cpu 周期)和堆栈内存。

您的代码片段的更清晰版本(没有错误检查)可以写成:

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. 使用调试器

调试器是你最好的朋友。了解它。使用调试器可以很容易地识别此错误的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2016-02-08
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多