Estoy empezando a construir una función C que divide una cadena de solicitud HTTP en "\ r \ n".

La función crea búferes locales cortos para cada fila de la solicitud HTTP, donde cada fila es el subcadena entre char *front y la ubicación del siguiente delimitador.

Sin embargo, veo que la llamada a strlen() en la línea 150 informa dos longitudes diferentes para el encabezado de la solicitud dependiendo de si las llamadas printf() en las líneas 146 y 147 están presentes o no.

Cuando se incluyen, 150 strlen(header) devuelve 21 (donde header = "Host: www.example.com") Sin las declaraciones printf(), 150 strlen(header) devuelve 30, por lo que printf() en la línea 152 incluye basura al final (Host: www.example.com HT*ԩU)

struct http_request *string_to_request(char *req, size_t req_len) {
  char *front = req;
  const char *delim = "\r\n";
  size_t delim_len = strlen(delim);

  char *c = strstr(front, delim);

  if (c > front) {
    size_t request_line_len = c - front;
    char request_line[request_line_len];
    strncpy(request_line, front, request_line_len);

    printf("%s\n", request_line);
    front += strlen(request_line) + delim_len;

    c += delim_len;
  }

  c = strstr(front, delim);
  size_t header_line_len = c - front;
  char header[header_line_len];
  strncpy(header, front, header_line_len);

  printf("%s\n", header);

  return 0;
}
1
donny-nyc 23 ene. 2021 a las 07:30

1 respuesta

La mejor respuesta

Usó strncpy para construir una cadena sin terminación nula. Intentar pasarlo a printf solo funcionaría si usaras un argumento de longitud de cadena, y strlen no funcionará en absoluto. La cadena tiene exactamente c - front caracteres de longitud, por lo que puede reemplazar la llamada strlen con c - front.

Así que estoy bastante seguro de que tiene la intención de hacer algo más donde está esa llamada printf. Tiene dos opciones de diseño para hacer.

  1. Puede abandonar cadenas terminadas en nulo y usar cadenas contadas para lo que sea que desee llamar aquí.

  2. Puede asignar un byte más en esa matriz e inicializarlo a cero y pasarlo a las funciones de cadena normales.

1
Joshua 23 ene. 2021 a las 05:17