为什么我会出现Segmentation故障?

时间:2015-11-19 12:38:00

标签: c string loops

我知道这与我的for循环有关。试图修改它,但无论我为参数添加什么,我仍然会遇到分段错误。

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

int
main(int argc, char * argv[])
{
   char* request_target = "/cat.html?q=Alice hej";

   // TODO: extract query from request-target
   char query[20];

   // finds start of query
   char* startofquery = strstr(request_target, "q=");
   if (startofquery != NULL)
   {
       int j = 0;
       for (int i = strlen(request_target) - strlen(startofquery); i  == ' '; i++, j++)
       {
           query[j] = request_target[i];
       }
       request_target[j] = '\0';
   }
   else
   {
       printf("400 Bad Request");
   }

   printf("%s", query);
} 

3 个答案:

答案 0 :(得分:4)

此行定义字符串文字

char* request_target = "/cat.html?q=Alice hej";

写入字符串文字是未定义的行为
你是在这里做的:

request_target[j] = '\0';

使用char数组

char request_target[] = "/cat.html?q=Alice hej";

此外,如果我理解正确,您正尝试从q=Alice中提取/cat.html?q=Alice hej。您实现的for循环有一些问题(i == ' '),如其他答案中所述。并不是必需的。您可以非常简单地复制此部分:

char *startofquery = strstr(request_target, "q=");
char *endofquery = strchr(startofquery, ' ');
int querySize = endofquery - startofquery;
if (startofquery != NULL && endofquery != NULL) {
    memcpy(query, startofquery, querySize);
    query[querySize] = '\0';
}

这不容易出错,最有可能表现更好。在这种情况下,您不需要将request_target定义为数组,但我建议将其设为const,以便在尝试编写时出现有用的编译器错误:

const char *request_target = "/cat.html?q=Alice hej";    

答案 1 :(得分:0)

我能看到的两点似乎很麻烦。

    你的for循环中的
  1. ,终止条件

    i  == ' '
    

    应该是

    request_target[i] != ' '
    

    如果你想运行循环,直到它得到一个空格字符,或者

    request_target[i] != '\0'
    

    如果你想运行循环直到源字符串的结尾。

  2. request_target[j] = '\0';应为query[j] = '\0';因为,

    1)您无法修改字符串文字,它是undefined behavior

    2)可能你想要终止目标数组。

答案 2 :(得分:0)

我在你的for循环中看到两个问题。第一个是条件:

 for (int i = strlen(request_target) - strlen(startofquery); i  == ' '; i++, j++)

此处i是一个整数(字符串中的位置),但您要与char(' ')进行比较。它应该是:

for (int i = strlen(request_target) - strlen(startofquery); request_target[i]  != ' '; i++, j++)

第二个问题是你在这里尝试写入字符串文字(UB):

 request_target[j] = '\0';

应该是:

 query[j] = '\0';