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 错误。但是当我返回这个指针或指针的原始值,指向第一个字符时,我什么也得不到(在第一种情况下)或只得到第一个字符(在第二种情况下)。

我没有忘记在末尾添加 '\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它足够大,可以同时携带 itelt 和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 回答