4

それで、インターンシップのスキルテストでこれを尋ねられました、そしてその時それは私を完全に困惑させました。動作するはずだと思ったコードがいくつかありますが、文字列に正しい値が割り当てられていません。

#include <iostream>
#include <string>
using namespace std;

int main()
{
     // declarations
     int i = 0, num= 63;
     string b="";

     while (num != 0)
     {
          i = num % 10;
          b.insert(0,i + 48 + "");
          num = num/10;
     }


     cout << b << endl;

     return 0;
}

「num」は整数値です(例として63を使用しました)

編集::私は間違って言い換えました、私は私のためにintから文字列への変換を行う関数を使用できませんでした、私は文字列ライブラリを使用できなかったというわけではありません、私の間違い。

4

5 に答える 5

6

挿入行をに変更します

b.insert(0, 1, '0' + i);

これにより、文字列のインデックス0に1回追加して取得した文字が挿入されます。i'0'


コードが機能しない理由の説明:

b.insert(0,i + 48 + "");

上記の行は呼び出しています

basic_string::insert( size_type index, const CharT* s );

ここで、ポインタは文字列リテラル48 + iのアドレスに追加することによって決定され""、結果としてガベージになります。

于 2012-10-17T23:53:37.953 に答える
0

非常に単純な解決策: 文字列ストリームを使用します。この場合、出力文字列ストリーム:

#include <iostream>
#include <string>
#include <sstream>

std::string IntToString(int value) {
    std::ostringstream ss;
    ss << value;
    return ss.str();
}

const char* IntToCString(int value) {
    std::ostringstream ss;
    ss << value;
    return ss.str().c_str();
}
于 2012-10-18T00:14:01.360 に答える
0

再帰関数をお勧めします:

std::string f( int val )
{
   if ( val >= 10 )
      return f( val / 10 ) + ( char )( val % 10 + '0' ) ;
   else
      return std::string( 1, '0' + val ) ;
}

使用法:

std::cout << f( 63 ) << std::endl ;

この関数は、非常にコストのかかるシフトを使用する (および文字列の前に置く) 代わりに、文字列に追加する必要があることに注意してください。

于 2012-10-18T00:01:00.103 に答える
0

コードには他にもエラーがあることに注意してください。たとえば、変換は では機能しませんnum == 0。より良いバージョンは次のとおりです。

#include <iostream>
#include <algorithm>
#include <string>
#include <cstdlib>

int main(int ac, char* av[])
{
    int num(ac == 1? 0: std::atoi(av[1]));
    std::string b;

    do
    {
        b.push_back((num % 10) + '0');
        num /= 10;
    }
    while (num != 0);
    std::reverse(b.begin(), b.end());
    std::cout << b << '\n';
    return 0;
}
于 2012-10-18T00:01:23.097 に答える
0

ライブラリを使用せず、割り当てを実行しないコードを次に示します。代わりに、ユーザーは十分な大きさのバッファーを提供することが期待されており、結果の文字列の先頭へのポインターを返します。

char * format(unsigned int n, char * buf, std::size_t len)
{
    if (len == 0) return NULL;

    char * p = buf + len;

    *--buf = 0;

    while (n && p > buf)
    {
        *--buf = '0' + (n % 10);
        n /= 10;
    }

    return n == 0 ? p : NULL;
}

関数が制御外のことを何も行わないため、組み込みの人々は特にこれを好むかもしれません。

使用法:

char buf[100];
char * s = format(12345, buf, sizeof buf);
if (s) { printf("Formatted: %s\n", s); }
于 2012-10-18T00:30:59.883 に答える