Странное поведение программы - 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;
Объяснение кода листинга программы
- Переменная
nинициализируется значением 0. - Если условие
question_mark != NULLистинно, то выполняется следующий блок кода, иначе выполняется блок кода после оператораelse. - В блоке кода после оператора
ifпеременнаяnинициализируется разницей междуstrchr(line, '?')иstrchr(line, ' '). - В блоке кода после оператора
elseпеременнаяnинициализируется разницей междуstrrchr(line, ' ')иstrchr(line, ' '). - Переменная
bufинициализируется строкой, которая содержитrootи пробелы (nраз). - В строку
bufкопируется значение переменнойroot. - В строку
bufдобавляется строкаstrchr(line, '/')до тех пор, пока не будет достигнуто значение переменнойn. - Значение переменной
pathприсваивается значению переменнойbuf.