Странное поведение программы - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д