Странное поведение программы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Ниже - черновик. Когда программа выходит из условия if (question_mark != NULL) , то переменная path равна значению buf, что правильно. Но потом, path случайным образом меняется, но точно не должна этого делать (см. скрины дебагера). Подозреваю, что проблема с дебагером, потому что эта переменная меняется, в разных местах после выхода из условия и когда пытаюсь выведать значения переменных. Но ошибка сегментации, которую я пытаюсь найти не исчезает. Помогите, пожалуйста.
#define _GNU_SOURCE
#define _XOPEN_SOURCE 700
#define _XOPEN_SOURCE_EXTENDED
 
// limits on an HTTP request's size, based on Apache's
// [url]http://httpd.apache.org/docs/2.2/mod/core.html[/url]
#define LimitRequestFields 50
#define LimitRequestFieldSize 4094
#define LimitRequestLine 8190
 
// number of octets for buffered reads
#define OCTETS 512
 
// header files
#include <arpa/inet.h>
#include <errno.h>
#include <limits.h>
#include <math.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
 
const char* lookup(const char* extension);
char* root = NULL;
 
int main(void)
{
    char line[] = "GET /cat.html?name=Bob HTTP/1.1\r\n";
    root = "home/jharvard/Dropbox/CS50/pset6/public";
    
    char* question_mark = NULL;
    question_mark = strchr (line, '?');
    
     char* path = NULL;
            
      if (question_mark != NULL) // вот в это условие 
      {
          char buf[strlen(root) + strchr(line, '?') - strchr(line, ' ')];
          strcpy(buf, root);
          strncat(buf, strchr(line, '/'), strrchr(line, '?') - strchr(line, ' ') - 1);
          path = buf;
      }
      else
      {
          char buf[strlen(root) + strrchr(line, ' ') - strchr(line, ' ')];
          strcpy(buf, root);
          strncat(buf, strchr(line, '/'), strrchr(line, ' ') - strchr(line, ' ') - 1);
          path = buf;
      }
    char extension[strchr(path, '\0') - strchr(path, '.')];
    strncpy(extension, strchr(path, '.') + 1, strchr(path, '\0') - strchr(path, '.'));
  
    printf("%s\n", path);
    return 1;
}
 
const char* lookup(const char* extension)
{
     if (strcmp(extension, "html") == 0)
     return "text/css";
     return NULL;
}

Решение задачи: «Странное поведение программы»

textual
Листинг программы
    int n;
    if (question_mark != NULL) // вот в это условие
    {
        n = strchr(line, '?') - strchr(line, ' ');
    }
    else
    {
        n = strrchr(line, ' ') - strchr(line, ' ');
    }
 
    char buf[strlen(root) + n];
    strcpy(buf, root);
    strncat(buf, strchr(line, '/'), n-1);
    path = buf;

Объяснение кода листинга программы

  1. Переменная n инициализируется значением 0.
  2. Если условие question_mark != NULL истинно, то выполняется следующий блок кода, иначе выполняется блок кода после оператора else.
  3. В блоке кода после оператора if переменная n инициализируется разницей между strchr(line, '?') и strchr(line, ' ').
  4. В блоке кода после оператора else переменная n инициализируется разницей между strrchr(line, ' ') и strchr(line, ' ').
  5. Переменная buf инициализируется строкой, которая содержит root и пробелы (n раз).
  6. В строку buf копируется значение переменной root.
  7. В строку buf добавляется строка strchr(line, '/') до тех пор, пока не будет достигнуто значение переменной n.
  8. Значение переменной path присваивается значению переменной buf.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы