0

整数を視​​覚的に同等の文字列に変換する関数を広範囲に検索し、何も見つからなかった後、私は自分で書くことにしました。

関数"ascii"は、変換される整数、変換された整数を保持する文字列、および0のままにすることを目的としたカウンターの3つの引数を取ります。

void ascii(int c, char str[], int k) {
    if (c <= 9) {
        str[k] = c + '0';
    }

    else if (c >= 10) {
        str[k] = c / 10 + '0';
        ascii(c % 10, str, k + 1);
    }
}

この関数を1桁の数字でテストしても、予期しないことは何も起こりませんが、数字が大きくなると、物事が乱雑になり始めます。76は「761」、765は「| 51」、7658は「-81」になります。数字を構成する桁数が多いほど、結果の文字列から理解できる意味が少なくなります。何が得られますか?

4

4 に答える 4

3

私はここに問題があると信じています:

else if (c >= 10) {
    str[k] = c % 10 + 48;
    ascii(c / 10, str, k + 1);
}

算術演算が逆になりました。結果の配列は後で反転する必要があり(別の関数から、問題の関数をヘルパーとして呼び出します)、'\0'文字で終わる必要があります。

または、結果を逆の順序で出力配列にコピーすることもできますが、これは、桁数が事前にわかっていることを前提としています。

于 2012-12-26T02:26:58.973 に答える
1

この場合c = 123、効果的にこれを行っています。

    str[k] = 12 + '0';
    ascii(3, str, k + 1);

あなたが何をしようとしているのかわかりませんが、それはおそらくあなたが意図したことではありません。

于 2012-12-26T02:28:13.127 に答える
0

他の回答は、最も重要な間違いを指摘しました-あなたはモジュロと除算を交換しました。それでも、修正しても、生成された文字列は反転されます。モジュロを使用すると、最下位桁がすぐに取得され、右に移動するはずですが、最初は不明であるため、左に配置します。文字列。

この文字列を反転するか、対数を使用して桁数を見つけるか、別の再帰的アプローチを使用することができます。

void ascii(int c, char str[])
{
    if(c<0)
    {
        *(str++)='-';
        c=-c;
    }
    *(ascii_helper(c, str))='\0';
}

char * ascii_helper(int c, char str[])
{
    if (c > 9)
        str=ascii_helper(c/10, str);
    *str = c%10 + '0';
    return str+1;
}

これは、数字の実際の書き込みを、それらの位置がわかるまで延期することによって機能します。再帰は最上位桁が見つかるまで続き、その後、各呼び出しは呼び出し元に次の文字の位置を返します。これは、各桁を正しく配置するために使用されます。この関数は元の関数のようにテール最適化できないため、スペース効率が低くなることに注意してください(ただし、intsは通常20桁を超える数字を保持できないため、これはほとんど無関心です)。

于 2012-12-26T02:42:28.793 に答える
0
  • まず、モジュロと除算を交換しました。これが、予期しない答えが得られる理由です。
  • さらに、これはあなたが期待している逆の答えを与えます。それで数を見直して、それからそれを解決してみてください。

    void ascii(int c, char str[], int k) {
    /*first let us reverse the string
    because recursive solution will be reverse of our expected solution*/
    int r=0,i;
    for(i=c;i>0;i=i/10)
    r=r*10+i%10;
    
    if (r <= 9) {
        str[k] = r + '0';
    
    }
    else if (r >= 10) {
         ascii(r / 10, str, k+1 );
         str[k] = r%10 + '0';
    }
    return;
    }
    
于 2012-12-26T09:31:42.810 に答える