指针无法在 C++ 函数中维护

pointer cannot maintain in c++ function

本文关键字:函数 维护 C++ 指针      更新时间:2023-10-16
void concat(char *str, char *ch, int num)
{
    *str= *ch; ++str;
    while (num>0) {
        *str = '0' + num % 10;
        num /= 10;
        ++str;
    }
}
concat(runner, 'a', 10);
concat(runner, 'b', 20);

我只想将一个像"a"这样的字符连接到 10,预期结果将是 a10第一行工作正常。但我只是想在第一行(Concat A10)之后,跑步者应该指向字符串的末尾,所以当我运行第二行时,它应该是 A10B20,但实际结果是 B20 覆盖 A10。我想应该是指针问题,你能帮我吗?

我正在完全改变我的答案。 把它放在函数的开头:

void concat(char * str, const char * ch, int num) {
    while (*str) {
         ++str;
    }

然后保持其余的相同。 这确实是 concat 应该的样子。 只需确保 runner[0] == 0 在第一次调用它之前! 并将以下代码添加到函数的末尾,在最后一个大括号之前:

    *str = 0;
}

使用 & 应该没问题或者实际上在 C 中,您可以使用 **,两种方式。

好吧,代码会按照您的要求进行操作。

为此,您需要找到第一个字符串的末尾,然后添加到其中:

void concat(char *str, char *ch, int num)
{
    str += strlen(str); /* make sure we start adding at the end of str */
    *str= *ch; ++str;
    while (num>0) {
        *str = '0' + num % 10;
        num /= 10;
        ++str;
    }
}

但是现在你必须确保 str[0] 在开始时是 0

因为每次调用 concat 时,str 的索引都是从 0 开始的。这就是 str 的内容被覆盖的原因。只需跳过 str 中的所有填充位置,然后再附加任何位置。

问题是您的函数不知道正在传入的字符串的结尾。要解决此问题,您需要将char *初始化为所有0。另一个问题是您将数字错误地转换为字符。最后,该函数没有任何安全的东西,因为字符串的大小没有传入,所以你只需要确保事先分配足够的空间。

void concat(char *str, const char *ch, int num)
{
    //This is function not safe since you do not
    //know how much space str has allocated
    str += strlen(str);
    *str = *ch; ++str;
    if(num < 0)
    {
        *str = '-';//Add the -
        ++str;
        num *= -1; //Make the number positive
    }
    //Determine the number of digits first
    //because you need to add characters backwards
    int digits = 0, tmpnum = num;
    while (tmpnum) {
        tmpnum /= 10;
        ++digits;
    }
    while(digits--)
    {
        str[digits] = '0' + num % 10;
        num /= 10;
    }
}

用法:

char *runner = new char[20]();
//or
//char *runner = (char*)calloc(20, 1);    
concat(runner, "a", 10);
concat(runner, "b", 20);
concat(runner, "c", -30);
delete [] runner;
//or if you used calloc
//free(runner);

我这样做假设这是一个家庭作业,有更简单/更安全的方法来完成这项工作,特别是使用C++这是您的问题被标记的内容。