Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编程-如何匹配字符串的结束字符?_C_Regex - Fatal编程技术网

C编程-如何匹配字符串的结束字符?

C编程-如何匹配字符串的结束字符?,c,regex,C,Regex,如何匹配字符串的结束字符 这是我的密码: int ownRegex(char* str_request, char* str_regex) { int err; regex_t preg; err = regcomp(&preg, str_regex, REG_NOSUB | REG_EXTENDED); if (!err) { int match; match = regexec(&preg, str_request, 0, NULL, 0);

如何匹配字符串的结束字符

这是我的密码:

int ownRegex(char* str_request, char* str_regex) {
  int err;
  regex_t preg;
  err = regcomp(&preg, str_regex, REG_NOSUB | REG_EXTENDED);

  if (!err) {
    int match;
    match = regexec(&preg, str_request, 0, NULL, 0);
    regfree(&preg);

    if (!match)
        return 0;
    else if (match == REG_NOMATCH)
        return match;
    else {
        char *text;
        size_t size;

        size = regerror(err, &preg, NULL, 0);
        text = malloc(sizeof(*text) * size);
        if (text) {
            regerror (err, &preg, text, size);
            fprintf(stderr, "%s\n", text);
            free(text);
        } else
            fprintf(stderr, "im");
        exit(errno);
    }
  }
  return err;
}
我想做的是匹配这些行:

GET/HTTP/1.1”或“GET/HTTP/1.0”,因此我使用正则表达式“^GET/HTTP/1\[01]$

因为我不想在HTTP版本后面加一个寄生词,比如“GET/HTTP/1.1blabla”

但是当我使用这个正则表达式时,我没有一行尝试匹配

[编辑]

下面是我如何调用我的函数:

int match = ownRegex(clientMessage, "^GET / HTTP/1\\.[01]$");
if (match)
    printf("400\n");
else
    printf("200\n");
(我简化了代码)

下面是我试过的台词: `

  • GET/HTTP/1.1”->返回400,应该是200
  • GET/HTTP/1.0”->返回400,应该是200
  • 获取/HTTP/1a1”->返回400
  • 获取/HTTP/1.2”->返回400
  • AGET/HTTP/1.1”->返回400
  • A GET/HTTP/1.1”->返回400
  • GET/HTTP/1.1测试”“->返回400
  • GET/HTTP//1.1”->返回400
  • 获取/HTTP/1.1”->返回400
  • 因此,只有前两行是正确的,但是只有n°3到9有正确的返回,因为我的函数总是返回400

    此外,如果我删除正则表达式中的“$”,则除n°7之外,所有行都具有正确的返回值

    我希望我已经澄清了我的问题:)

    [结束编辑]

    你知道我做错了什么吗


    感谢您阅读我的文章,并为我的英语感到抱歉。

    已解决

    嗯,多亏@WiktorStribiżew让我意识到了一些事情,我的字符数组总是以'\r\n''\n'结尾,而不仅仅是'\0'像文字字符串一样

    所以我不得不修改我的正则表达式:

    match=ownRegex(clientMessage,“^GET/HTTP/1\\[01]\r{0,1}\n”)


    再见。

    显示您在C代码中使用的正则表达式字符串。请回答您的问题并显示一个。您既没有显示正则表达式,也没有显示要匹配的文本。是的,您解释了它是什么,但您必须向我们展示执行此操作的代码。
    “^GET/HTTP/1\\\[01]$”
    应该可以。您也可以使用
    “^GET/HTTP/1[.][01]$”
    是否可以修改第一次打印以输出实际的
    匹配值,并将其显示给我们?这似乎有效-