为什么我可以单独打印出每个角色但不能整体打印出来?

时间:2015-11-08 13:45:31

标签: c server cs50

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

这与记忆管理不善有关吗?

这是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 -9 strlen(line)-9中的硬编码是不好的做法。但我无法弄清楚如何只读取请求目标cat.html中的字符。我知道标题由method SP request-target SP HTTP-version CRLF指定(CRLF又名\r\n两个字符?)所以-9有效(我认为)但可能不是最好的。

编辑:我编辑了我的循环,以便在最后添加一个空终止符。这原本应该是,但由于我已经编辑了我的代码,所以它被错误地删除了。它仍然无效。

1 个答案:

答案 0 :(得分:2)

您的代码具有未定义的行为,因为它会写入您分配的空间。

你做这个副本

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有足够的空间容纳您希望存储在其中的字符,包括空终结符。