-1

我有一个函数原型,它为我提供了我想要的结果:

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

int main ()
{
  char * pch;
  char str[] = " 81.243.230.174, 10.1.0.102";
  pch = (char*) memchr (str, ',', strlen(str));
  char * tch;
  memcpy (tch, str, pch-str);
  if (pch!=NULL){
    printf ("',' found at position %ld.\n", pch-str);
    printf ("XFF: %s\n", tch);
  } else {
    printf ("',' not found.\n");
  }
  return 0;
}

返回以下内容:$>',' 位于位置 15。$>XFF: 81.243.230.174

我想将libvcl的VRT_GetHdr的输出处理为上面的str,如下:

char * pch;
char str[] = VRT_GetHdr(sp, HDR_REQ, "\023X-FF:");
pch = (char*) memchr (str, ',', strlen(str));
char * xff;
memcpy (xff, str, pch-str);

    if (get_country_code)
            VRT_SetHdr(sp, HDR_REQ, "\017X-Country-Code:", (*get_country_code)(xff), vrt_magic_string_end);

VRT_GetHdr 返回一个 char 指针,编译器抱怨“初始化程序无效”。

如果我将 char str[] 的分配更改为 char *str ,清漆会在运行时消失(可能带有段错误)。如何在不使用上述指向数组混乱的指针的情况下从我的内联 C 中获得预期的结果?

4

2 回答 2

1

一旦你克服了编译器错误,你就会得到一个段错误。xff在复制到它之前,您需要分配内存。

char * pch;
char* str = VRT_GetHdr(sp, HDR_REQ, "\023X-FF:");
pch = (char*) memchr (str, ',', strlen(str));
char* xff = malloc(pch-str);
memcpy (xff, str, pch-str);
/* use xff as required */
free(xff);
于 2012-11-20T12:59:12.947 回答
0

你不能。

初始化表达式必须是文字以提供编译时大小,而您的函数调用不是。

您也许可以使用 C99 的自动数组来解决这个问题,但只使用动态分配的数组(使用malloc(),或者strdup()如果你有它)可能更容易和更清晰。

甚至是“足够大”的静态限制,如果您有理由相信返回值的长度存在一些限制。

您的代码读起来有点像 的重新实现strtok(),也许您可​​以直接使用它?

于 2012-11-20T12:57:26.387 回答