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 处插入通过添加一次获得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

我建议递归函数:

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

非常简单的解决方案:使用字符串流。在这种情况下,输出字符串流:

#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

这是一些不使用任何库且不执行分配的代码。相反,用户应该提供一个足够大的缓冲区,然后她会收到一个指向结果字符串开头的指针作为回报:

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 回答