簡體   English   中英

為什么我可以單獨打印每個字符而不是整體打印?

[英]How come I can print out each character separately but not as a whole?

這是服務器實現的一部分,我將通過請求行標頭並相應地給出輸出。 這可能是一個基本問題。 為什么我可以單獨打印出每個字符而不是整個字符串?

這與內存管理不善有關嗎?

這是 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有效(我認為)但可能不是最好的。

編輯:我編輯了我的循環,以便在最后添加一個空終止符。 這本來是要放進去的,但由於我現在對代碼進行了大量編輯,因此被錯誤地刪除了。 盡管如此,它仍然不起作用。

您的代碼具有未定義的行為,因為它寫入了您分配的空間。

你做這個副本

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有足夠的空間來存儲您希望在其中存儲的字符,包括空終止符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM