0

標準ライブラリ(仕様の一部)を使用せずに、さまざまな文字をchar*に連結するメソッドを実装する必要があります。だから、無strcatのかstrcopy。私は、文字列のどちらを使用することはできません。

これが私がやろうとしたことです(文字は自分で実装したStringListに格納されているため、「GetCell」メソッドと-> nextポインター):

  char* IntlFinder::ConcatenateSrc ( int nSource, long beginPosition )
        char* res = new char;
        Cell* cell = ComList.GetCell(beginPosition);
        for (long i = beginPosition; i <= (CountTab[nSource]); i++)
        {
            if (nSource == 0 || cell->elem.source == nSource)
            {
                res[i-beginPosition] = cell->elem.caractere;
            }
            cell = cell->next;
        }

        *res = '\0';
        return res;
    }

デバッグしているとき、これは特定の文字に到達するまでは見栄えがよく、その後は理由もなくバグが発生します(その時点で指しているセルは、有効なアドレスで正常に見えます)。

それについて何か考えはありますか?

-

編集:私は代わりにこれをやろうとしました:

    for (long i = beginPosition; i <= (CountTab[nSource]-1); i++)
    {
        if (nSource == 0 || cell->elem.source == nSource)
        {
            *res = cell->elem.caractere;
            ++res = new char;
        }
        cell = cell->next;
    }

これは、ポインタをインクリメントしてメモリを割り当てることになっているため(次の反復で別の値を追加できるようになります)、SIGSERVエラーは発生しなくなりました。しかし、このポインターまたはポインターの元の値を返し、最初の文字にポインティングすると、何も得られない(最初の場合)か、最初の文字だけが得られます(2番目の場合)。

最後に「\0」を追加することを忘れませんでしたが、それでも文字列にはなりません。

4

1 に答える 1

4

何かのようなもの:

char * concat(char dest[], char src[])
{
   int i = 0, j = 0;
   while (dest[i]) ++i;
   while (src[j]) dest[i++] = src[j++];
   dest[i] = '\0';
   return dest;
}

それdestがitseltと。の両方を運ぶのに十分な大きさであるという条件でsrc。そうしないと、配列の境界外に書き込むため、予期しない結果が生じる可能性があります。

追加

int main()
{
    char * buf = new char[1 << 30]; // allocate 2^30 = 1e9+ chars (very huge size)
    // you can use char buf[1 << 30];
    // which is faster and not needing to be released manually
    char tmp[] = "First portion";
    char tmp2[] = "Second porition";
    buf[0] = '\0'; // so that concat begins copying at 0
    concat(buf, tmp);
    // buf == "First portion"
    concat(buf, tmp2);
    // buf = "First portionSecond portion"

    ....
    // don't forget to release memory after you have finished
    delete[] buf;
    return 0;
}
于 2012-10-05T21:52:29.737 に答える