I use strtok to split line, the odds is of http_version. sometimes it's just fine as print HTTP/1.1, but sometimes it prints HTT .

  printf("%s \n", line);
            // TODO: validate request-line
            char sp=' ';
            char* method = strtok(line,&sp);
            char* request_target = strtok(NULL,&sp);
            char* http_version = strtok(NULL,&sp);  //print "HTT" sometimes 
            printf("%s\n line: %s \n request_target:%s\n http_version:%s \n",method,line,request_target,http_version );

this is error printing:

    GET /hello.html HTTP/1.1
     line: GET  //I think this result is right, due to  strtok method replace space to '\0'
     http_version:HTT    //

According to cppreference.com the definition of strtok() is:

char* strtok( char* str, const char* delim );

Finds the next token in a null-terminated byte string pointed to by str. The separator characters are identified by null-terminated byte string pointed to by delim.

This function is designed to be called multiples times to obtain successive tokens from the same string.

  • If str != NULL, the call is treated as the first call to strtok for this particular string. The function searches for the first character which is not contained in delim.

    • If no such character was found, there are no tokens in str at all, and the function returns a null pointer.
    • If such character was found, is it the beginning of the token. The function then searches from that point on for the first character that is contained in delim.

      • If no such character was found, str has only one token, and the future calls to strtok will return a null pointer
      • If such character was found, it is replaced by the null character '\0' and the pointer to the following character is
        stored in a static location for subsequent invocations.
    • The function then returns the pointer to the beginning of the token
  • If str == NULL, the call is treated as a subsequent calls to strtok: the function continues from where it left in previous invocation. The behavior is the same as if the previously stored pointer is passed as str.

Try this:

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

int main(void)
    char line[] = "GET /hello.html HTTP/1.1";
    printf("line: %s\n", line);
    char* sp = " ";
    char* method = strtok(line, sp);
    char* request_target = strtok(NULL, sp);
    char* http_version = strtok(NULL, sp);
    printf("method: %s\nrequest_target:%s\nhttp_version:%s\n", method, request_target, http_version);
    return 0;

It has output:

line: GET /hello.html HTTP/1.1
method: GET

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .