-3

::amf aa :amfe のようなものの間で解析しようとしています。しかし、いくつかの余分な値が文字列に追加されています。コードでは、すべてがより具体的です

char *aparse(char *str,char *a1,char *a2)
{
    char *aa;
    char *cr = strstr(str,a1);
    char *sr =  strstr(str,a2);
    int first = cr-str;
    int second =  sr-str;
    int ftag = first+5;
    int stag  = second-1;
    long wtag = stag-ftag;
    int i=0;


    aa =  malloc(wtag);


    for (i=0; i<wtag; i++)
    {
        aa[i] = str[ftag];

        ftag++;

    }


printf ("%s\n",aa);
return aa;
}

これは私のパーサーコードです。

    char *aa = ":amf gosadaogle :amfe :fil doc :file";
char *music = aparse(aa,":amf",":amfe");
char *o = aparse(aa,":fil",":file");

これは私が関数を呼び出す方法です.しかし、文字列の1つには、私が知らない場所から来る余分な文字が付属しています.それはo = docのようなものですが、音楽= gosadaogle.やりたいmalloc.どうすれば解決できますか

申し訳ありませんが、私の問題を明確に伝えることができないと思います

これは説明します

:amf と :amfe の間の値を抽出しようとしています。音楽または o 変数に追加されたいくつかの余分な文字を aparse で抽出している間

4

1 に答える 1

0

私が言えることから、文字列にゼロ終端を追加していることはわかりません。Cでは、文字列の終わりに「\0」を配置して文字列の終わりをマークする必要があります。(これが、文字列に割り当てられるサイズが文字数+1でなければならない理由でもあります)。そのような終了マーカーがない場合は、文字列の後にランダムなゴミが発生します。

wtagの計算は、結果の文字列の長さを計算することだと思います。そのため、「+1」サイズが欠落しているという問題が発生しました。もう1つの問題は、ftagに依存するはずの「任意の」数値「5」で値をオフセットしていることですstrlen(a1)

追加したい他のいくつかのメモがあります:

  1. const char *パーサーを呼び出すために使用するコードは、を非定数値に変換することについて警告を与える可能性があります。これはchar *aparse(char *str,char *a1,char *a2)、渡された文字列を変更できるようにしたいとコンパイラーに思わせるためです。パラメータを変更しないので、これをchar *aparse(const char *str, const char *a1, const char *a2)に変更する必要があります。
  2. コピー関数を自分でコーディングする代わりに、strncpy()を使用して文字列をコピーできます。これにより、長い文字列のコピープロセスが高速化されます。また、文字列をコピーした後に「\ 0」を追加するように注意してください。これは、strncpyが必ずしもこれを行うとは限らないためです。
  3. strstrNULLが返されたかどうかを確認する必要があります。これは、の場合に発生する可能性があるため、a1またはa2に存在しないためstrです。
于 2013-02-23T10:14:10.577 に答える