为什么我可以单独打印出每个字符而不是作为一个整体?
How come I can print out each character separately but not as a whole?
这是服务器实现的一部分,我将通过请求行 header 并相应地给出输出。这可能是一个基本问题。为什么我可以单独打印出每个字符而不是整个字符串?
这与内存管理不善有关吗?
这是 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] = '[=10=]';
}
else
printf(" 501 Not Implemented");
printf("requestTarget: %s\n", requestTarget);
free(requestTarget);
return 0;
}
旁注,我知道在我的 for lop strlen(line)-9
中硬编码 -9
是不好的做法。但是我无法弄清楚如何只读取请求的目标 cat.html
中的字符。而且我知道 header 由 method SP request-target SP HTTP-version CRLF
指定(CRLF 又名 \r\n
两个字符吗?)所以 -9
有效(我认为)但可能不是最好的。
编辑:我编辑了我的循环,以便在末尾添加一个空终止符。本来是想放在里面的,但是由于我对代码的编辑太多了,所以现在被错误地取出来了。不过还是不行。
您的代码有未定义的行为,因为它写入了您分配的 space。
你做这个文案
requestTarget[i] = line[i];
当 i
指向 line[]
中间的某个位置时,但 requestTarget
需要较小的索引。您需要 "translate" 索引,或为目标创建一个单独的索引:
int j = 0;
for (int i = (ch-line); i < strlen(line)-9; i++, j++)
{
requestTarget[j] = line[i];
printf("%c", requestTarget[j]);
}
requestTarget[j] = '[=11=]';
注意: 您需要确保 requestTarget
有足够的 space 用于您希望在其中存储的字符,包括空终止符.
这是服务器实现的一部分,我将通过请求行 header 并相应地给出输出。这可能是一个基本问题。为什么我可以单独打印出每个字符而不是整个字符串?
这与内存管理不善有关吗?
这是 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] = '[=10=]';
}
else
printf(" 501 Not Implemented");
printf("requestTarget: %s\n", requestTarget);
free(requestTarget);
return 0;
}
旁注,我知道在我的 for lop strlen(line)-9
中硬编码 -9
是不好的做法。但是我无法弄清楚如何只读取请求的目标 cat.html
中的字符。而且我知道 header 由 method SP request-target SP HTTP-version CRLF
指定(CRLF 又名 \r\n
两个字符吗?)所以 -9
有效(我认为)但可能不是最好的。
编辑:我编辑了我的循环,以便在末尾添加一个空终止符。本来是想放在里面的,但是由于我对代码的编辑太多了,所以现在被错误地取出来了。不过还是不行。
您的代码有未定义的行为,因为它写入了您分配的 space。
你做这个文案
requestTarget[i] = line[i];
当 i
指向 line[]
中间的某个位置时,但 requestTarget
需要较小的索引。您需要 "translate" 索引,或为目标创建一个单独的索引:
int j = 0;
for (int i = (ch-line); i < strlen(line)-9; i++, j++)
{
requestTarget[j] = line[i];
printf("%c", requestTarget[j]);
}
requestTarget[j] = '[=11=]';
注意: 您需要确保 requestTarget
有足够的 space 用于您希望在其中存储的字符,包括空终止符.