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'のような1つの文字を10に連結したいだけですが、期待される結果はa10になります。最初の行は正常に機能します。しかし、最初の行(concat a10)の後で考えると、ランナーは文字列の終わりを指す必要があるため、2番目の行を実行すると、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である必要があります。**は、2つの方法で使用できます。

于 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

concatが呼び出されるたびに、strのインデックスは0から始まります。そのため、strの内容は上書きされます。strに追加する前に、str内のすべての塗りつぶされた位置をスキップしてください。

于 2012-12-05T19:55:07.983 に答える
0

問題は、渡された文字列の終わりを関数が認識しないことです。これを修正するにはchar *、すべて0のまたはに初期化する必要があります\0。もう1つの問題は、数値を文字に誤って変換していることです。そして最後に、文字列のサイズが渡されないため、関数について安全なものは何もありません。そのため、事前に十分なスペースを割り当てる必要があります。

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 に答える