您好,我正在尝试将一些代码从 Windows 移植到 Linux。我有这个:
itoa(word,aux,2);
但是 GCC 不承认 itoa。如何以 C++ 方式将此转换为 base 2?
谢谢 ;)
这是汤姆的答案,修改为根据您的代码需要使用基础:
void itoa(int n, char s[], std::size_t base = 10) {
const char digits[] = "0123456789abcdef";
int i, sign;
if (base < 2 || base > 16)
throw std::invalid_argument("invalid base");
if ((sign = n) < 0) /* record sign */
n = -n; /* make n positive */
i = 0;
do { /* generate digits in reverse order */
s[i++] = digits[n % base]; /* get next digit */
} while ((n /= base) > 0); /* delete it */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
这里有一些帮助
/* itoa: convert n to characters in s */
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* record sign */
n = -n; /* make n positive */
i = 0;
do { /* generate digits in reverse order */
s[i++] = n % 10 + '0'; /* get next digit */
} while ((n /= 10) > 0); /* delete it */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
您应该根据自己的需要调整它(注意这个有 2 个参数,而不是 3 个)另外请注意反向功能也在维基百科链接中。
此外,还有一些其他情况(但不适用于 base 2)
此函数未在 ANSI-C 中定义,也不是 C++ 的一部分,但受某些编译器支持。
在某些情况下,符合标准的替代方案可能是 sprintf:
sprintf(str,"%d",value)
转换为十进制基数。
sprintf(str,"%x",value)
转换为十六进制基数。
sprintf(str,"%o",value)
转换为八进制。
这里有一个 itoa 实现的页面
boost::lexical_cast 呢?
http://www.boost.org/doc/libs/1_43_0/libs/conversion/lexical_cast.htm
如何使用递归的力量?:)
int convert_base(int v, int b){
if (v == 0) return 0;
else
return (v%b+10*convert_base(v/b,b));
}