我有一个函数原型,可以为我提供所需的结果:

#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

我想像上面的str一样处理libvcl的VRT_GetHdr的输出,如下所示:

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 []

    字符* str
,清漆会在运行时死亡(可能带有段故障)。
我如何从内联C中获得预期结果,而无需使用上述指针来处理数组混乱?

最佳答案

你不能

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

您也许可以使用C99的自动数组解决此问题,但是仅使用动态分配的数组(使用malloc()strdup(),如果有的话)可能更容易,更清洁。

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

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

关于c - 避免在内联c中使用无效的initlaliser,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13473673/

10-11 22:36
查看更多