【问题标题】:How come I can print out each character separately but not as a whole?为什么我可以单独打印每个字符而不是整体?
【发布时间】:2016-02-09 05:49:30
【问题描述】:

这是服务器实现的一部分,我将通过请求行标题并相应地给出输出。这可能是一个基本问题。为什么我可以单独打印每个字符而不是整个字符串?

这与内存管理不善有关吗?

这是CS50 中 pset6 的一部分。

 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

 int
 main(int argc, char * argv[])
 {
    char* line = "GET /cat.html HTTP/1.1";

    char* method = strstr(line, "GET");
    if (strcmp(method, line) != 0)
    {
        printf("405 Method Not Allowed");
    }

    printf("%s\n", line);

    char* requestTarget = malloc(10);
    char* ch = strchr(line,'/');
    if (ch != NULL)
    {
        int i = 0;
        for (i = (ch-line); i < strlen(line)-9; i++)
        {
            requestTarget[i] = line[i];
            printf("%c", requestTarget[i]);
        }
        requestTarget[i] = '\0';
    }

    else
         printf(" 501 Not Implemented");

    printf("requestTarget: %s\n", requestTarget);

    free(requestTarget);
    return 0;
 } 

附注,我知道在我的 for lop strlen(line)-9 中硬编码 -9 是一种不好的做法。但我不知道如何读取请求的目标cat.html 中的字符。而且我知道标题是由method SP request-target SP HTTP-version CRLF指定的(是CRLF又名\r\n两个字符?)所以-9有效(我认为)但可能不是最好的。

编辑:我编辑了我的循环,以便在最后添加一个空终止符。这本来是要进去的,但是由于我已经编辑了我的代码,现在它被错误地取出了。但是还是不行。

【问题讨论】:

  • 您想了解 C-“字符串”实际上是什么,它们只是一个由 '\0' 终止的 char 数组(又名 null,又名 NUL一个只有一个),又名0)。
  • 你应该自己解决这个问题。你应该已经明确地学会了如何去做——除非你跳过了重要的课程。 (并制作lineconst!)
  • @Olaf Accoring to the Academig Honesty, under Resonable Sharing snippets of your own code online so that others might help you identify and fix a bug. 此外,这只是一个简单的测试程序,我只声明了“变量”,以便我可以测试我的不同功能。原始line 是分发代码的一部分。
  • @FelixRosén:我不是说你不应该问你是否遇到一般问题。但是你问的问题是你应该已经学过的基本知识。如果没有,您要么错过了课程,要么普遍缺乏对这些基础知识的理解。我不想冒犯你。只需做出自己的结论和行动。

标签: c server cs50


【解决方案1】:

您的代码具有未定义的行为,因为它超出了您分配的空间。

你做这个副本

requestTarget[i] = line[i];

i 指向line[] 中间的某个位置时,但requestTarget 需要较小的索引。您需要“翻译”索引,或为目标创建一个单独的索引:

int j = 0;
for (int i = (ch-line); i < strlen(line)-9; i++, j++)
{
    requestTarget[j] = line[i];
    printf("%c", requestTarget[j]);
}
requestTarget[j] = '\0';

注意:您需要确保requestTarget 有足够的空间来存储您希望在其中存储的字符,包括空终止符。

【讨论】:

  • 我以前也有过这样的情况,但没用。我也想在这篇文章中,但我已经多次编辑我的代码,所以它被错误地取出了。
  • @FelixRosén 看看编辑。它应该可以解决索引问题。
  • 是的,谢谢,当我做requestTarget[j] = line[i] 时它起作用了,我认为你应该说。谢谢!
猜你喜欢
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2017-01-21
  • 2016-10-17
相关资源
最近更新 更多