0
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。我认为这应该是指针问题,你能帮帮我吗?

4

5 回答 5

2

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

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

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

    *str = 0;
}
于 2012-12-05T19:29:31.910 回答
1

使用&应该可以或者实际上在c中,你可以使用**,两种方式。

于 2012-12-06T07:35:41.013 回答
0

好吧,代码可以满足您的要求。

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

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

于 2012-12-05T19:29:17.523 回答
0

问题是您的函数不知道传入的字符串的结尾。要解决此问题,您需要将您初始化char *为 all0\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++您的问题被标记的内容。

于 2012-12-05T20:03:27.263 回答
0

因为每次调用 concat 时,str 的索引都是从 0 开始的,所以才会覆盖 str 的内容。在添加任何内容之前,只需跳过 str 中的所有填充位置。

于 2012-12-05T19:55:07.983 回答