所以我在实习的技能测试中被问到这个问题,当时它让我完全感到困惑。我现在有一些代码,我认为应该可以工作,但是没有为字符串分配正确的值。
#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作为例子)
编辑::我错误地解释了,我不能使用任何为我做字符串转换的函数,而不是我不能使用字符串库,我的错误。答案 0 :(得分:6)
将插入行更改为
b.insert(0, 1, '0' + i);
这将insert在字符串中的索引0处将i
添加到'0'
一次获得的字符。
解释您的代码无效的原因:
b.insert(0,i + 48 + "");
上面一行正在调用
basic_string::insert( size_type index, const CharT* s );
通过将48 + i
添加到""
字符串文字的地址来确定指针,从而导致垃圾。
答案 1 :(得分: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 ;
请注意,此函数应附加到您的字符串,而不是使用非常昂贵的移位(并放在字符串的前面。)
答案 2 :(得分: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;
}
答案 3 :(得分: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();
}
答案 4 :(得分: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); }