以下は、コードブロックバージョン13:12の私のコードです。私は髪を紛失してここに尋ねるのを素早く断念したので、コメントはしていません!私の懸念は、自分のchar *
ターゲットが/cat.html?name=image
になると予想しているが、私は/cat.html
しか得られないということだ!これらの行の後なぜstrtok()は '?'を選択しないのですか?行からのキャラクター?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
const char *space = " ";
const char *marker = "?";
const char line[] = { "GET /cat.html?name=image HTTP/1.1" };
int n = strlen(line), i, j, k, a;
char string[n + 1];
for (i = 0; i <= n; i++) {
string[i] = line[i];
string[n] = '\0';
}
printf(" line has %i characters \n\n", n);
char *method = strtok(string, space);
char *target = strtok(NULL, space);
char *version = strtok(NULL, space);
char *abs_path = strtok(target, marker);
char *query = strtok(NULL, marker);
printf("\n line is:%s \n"
"\n method is:%s \n"
"\n target is:%s \n"
"\n version is:%s \n"
"\n abs_path is:%s \n"
"\n query is:%s \n\n\n",
line, method, target, version, abs_path, query);
int l = strlen(target);
if (strcmp(method, "GET") != 0) {
printf("wrong method error 405 \n\n");
}
printf(" target contains %i characters \n\n", l);
for (j = 0; j <= l; j++) {
if (target[0] != '/') {
printf("wrong target does not start with \\/error 501\n\n");
}
if (target[j] == '"') {
printf("wrong target error 400 has a \" \n\n");
}
}
if (strchr(abs_path, '.') == NULL) {
printf("wrong absolute path has no \. \n\n");
}
if (strncmp(version, "HTTP/1.1", 8) != 0) {
printf("wrong version not HTTP/1.1 error 505 \n\n");
}
return 0;
}
あなたのコードは、 'const char line [] =" ... ";'が与えられているので、火で再生されています。 'line [4] = line [4];'を書くと、定数配列を変更することができないので、コンパイラはあなたを妨害します。しかし、その配列を 'strtok()'に渡します。これは、配列上のさまざまな点にヌルを書き込んで配列全体を渡ります。それは動作することが保証されていません。 'line'の定義から' const'を削除してください。 –