1

int があり、その int を含む char* を取得したいと考えています。私のコードは次のとおりです。

int getLength(int x) {
    int l = 0;
    while(x) {
        l++;
        x /= 10;
    }
    return l;
}

char* toString(int x) {
    int l = getLength(x);
    char *str = new char[l];
    l--; // the digits will be placed on positions 0 to l-1
    while(l >= 0) {
        str[l] = x % 10 + '0';
        x /= 10;
        l--;
    }
    return str;
}

結果の一部:

toString(1009) = 1009Ä
toString(23) = 23L

なんで?l 文字だけにスペースを割り当てました。(l = int の長さ)

4

4 に答える 4

10

文字列を null で終了する必要があります。C 文字列は一連の文字の後に'\0', またはヌル文字が続きます。これが、さまざまな文字列処理関数が文字列の終了を認識する方法です。null がない場合、C 標準の文字列処理関数は、文字列の末尾を超えて、たまたまその先にある値まで読み続けます。

'\0'null のためのスペースを確保するために 1 文字余分に割り当て、最後にa を格納することを忘れないでください。

char *str = new char[l+1];
str[l] = '\0';

ちなみに、newはC++の演算子です。C では、 を使用しますmalloc()std::stringC++ では、メモリの割り当てを処理し、null 終了を必要としないため、おそらく を使用することをお勧めします。

于 2013-10-10T13:39:32.630 に答える
1

これはあなたの質問に直接答えることはありません(他の回答が正しく指摘しているようにヌルターミネータが欠落しているために、なぜ面白い出力が得られるのか)。関数を自分で書く必要がありますstd::ostringstream

#include <sstream>
#include <string>

std::string toString(int x)
{
    std::ostringstream stream;
    stream << x;
    return stream.str();
}
于 2013-10-10T13:58:25.143 に答える
0

log10 を使用して int の長さを取得できます。次に、char 配列の最後に null を配置する必要があります。

int getLength(int x) {
        return ceil(log10(x));
    }
    char* toString(int x) {
        int l = getLength(x);
        char *str = new char[l+1]; //+1 for null character
        str[l]='\0'; // putting null character at the end of char[]

        while(l >= 0) {
            str[--l] = x % 10 + '0'; // put the last digit in l - 1
            x /= 10;
        }
}
于 2013-10-10T13:52:35.357 に答える