-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ポインターを返し、コンパイラーは「無効な初期化子」について文句を言います。

charstr[]の割り当てを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 に答える