我需要实现一个方法,将不同的字符连接成char *,而不使用任何标准库(它是规范的一部分)。所以,没有strcat或strcopy。我也不能使用字符串。
这是我尝试做的事情(字符存储在我自己实现的StringList中,因此是“GetCell”方法和 - >下一个指针):
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错误。 但是当我返回这个指针或指针的原始值,poiting到第一个char时,我得不到任何东西(在第一种情况下)或只是第一个字符(在第二种情况下)。
我没有忘记在最后添加'\ 0',但这仍然不会使它成为一个字符串。
答案 0 :(得分: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;
}