itob(n,s,b)将整数n转换为以b为底的数。

whdugh 2012-11-16 04:39:13
编写函数itob(n,s,b)将整数n转换为以b为底的数。 并将转换结果以字符的形式保存到字符串s中。
下面是代码,但是有问题,当b为16时,不能处理10-15,这个怎么和a--f对应起来。谢谢
#include <stdio.h>
#include <string.h>
void reverse(char s[])
{
int i, j, c, len;
len = strlen(s);
for(j = 0, i = len - 1; j < i; ++j, --i)
{
c = s[j];
s[j] = s[i];
s[i] = c;
}
}
void itob(int n, char s[], int b)
{
int i;
i = 0;
do
{
s[i++] = n % b + '0';
}
while(n /= b);

s[i] = '\0';

reverse(s);
}
int main()
{
char s[1024];
itob(75, s, 16); //当b为16,输出有问题?
printf("%s\n", s);
return 0;
}
...全文
1859 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
oceanblueblue 2013-09-24
  • 打赏
  • 举报
回复
do { j = n % b; if (j <= 9) s[i++] = j + '0'; else s[i++] = j - 10 + 'a'; } while ((n /= b) > 0); s[i] = '\0'; reverse(s);
manxiSafe 2012-11-17
  • 打赏
  • 举报
回复
引用 7 楼 mymtom 的回复:
"01234567890ABCDEF"数组,[] 是下标操作符 这个就是array[i]的形式啊。 "01234567890ABCDEF"[n % b]就是第n % b个字符啊。 引用 6 楼 s_include 的回复:引用 2 楼 mymtom 的回复:或者更简单的,把 s[i++] = n % b + '0'; 改为 s[i++] = "012345……
呃,没想到这样也可以 不过也对,从数组名的 定义来看 也是 合理的
mymtom 2012-11-17
  • 打赏
  • 举报
回复
"01234567890ABCDEF"数组,[] 是下标操作符 这个就是array[i]的形式啊。 "01234567890ABCDEF"[n % b]就是第n % b个字符啊。
引用 6 楼 s_include 的回复:
引用 2 楼 mymtom 的回复:或者更简单的,把 s[i++] = n % b + '0'; 改为 s[i++] = "01234567890ABCDEF"[n % b]; 请教一下,"01234567890ABCDEF"[n % b]; 这是什么东西???
manxiSafe 2012-11-16
  • 打赏
  • 举报
回复
引用 2 楼 mymtom 的回复:
或者更简单的,把 s[i++] = n % b + '0'; 改为 s[i++] = "01234567890ABCDEF"[n % b];
请教一下,"01234567890ABCDEF"[n % b]; 这是什么东西???
whdugh 2012-11-16
  • 打赏
  • 举报
回复
引用 4 楼 mymtom 的回复:
if((c=s[i])> 9) s[i]=c+('a'-10); //将10--15转化成'a'--'f' 这里的i已经加过 1 了。 可以把 s[i++] = n % b + '0'; 改成 s[i] = n % b + '0'; 再把 i++; 加到循环的最后。
嗯 我知道了 还有一点就是 s[i]已经是字符了 就不能和9 比较了 谢谢 你 俺想明白了
mymtom 2012-11-16
  • 打赏
  • 举报
回复
if((c=s[i])> 9) s[i]=c+('a'-10); //将10--15转化成'a'--'f' 这里的i已经加过 1 了。 可以把 s[i++] = n % b + '0'; 改成 s[i] = n % b + '0'; 再把 i++; 加到循环的最后。
whdugh 2012-11-16
  • 打赏
  • 举报
回复
引用 1 楼 mymtom 的回复:
C/C++ code? 123456789101112131415161718192021222324252627282930313233343536 #include <stdio.h> #include <string.h> void reverse(char s[]) { int i, j, c, len; len = strlen(s); for……
版主 我自己改了下 void itob(int n, char s[], int b) { int i,c; i = 0; do { s[i++] = n % b + '0'; if((c=s[i])> 9) s[i]=c+('a'-10); //将10--15转化成'a'--'f' } while(n /= b); s[i] = '\0'; reverse(s); }还是不对额 ? 嗯。 你的方法真好。
mymtom 2012-11-16
  • 打赏
  • 举报
回复
或者更简单的,把 s[i++] = n % b + '0'; 改为 s[i++] = "01234567890ABCDEF"[n % b];
mymtom 2012-11-16
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>
void reverse(char s[])
{
    int i, j, c, len;
    len = strlen(s);
    for(j = 0, i = len - 1; j < i; ++j, --i)
    {
        c = s[j];
        s[j] = s[i];
        s[i] = c;
    }
}
void itob(int n, char s[], int b)
{
    char xdigits[] = "0123456789ABCDEF";
    int i;
    i = 0;
    do
    {
        s[i++] = xdigits[n % b];
    }
    while(n /= b);
 
    s[i] = '\0';
 
    reverse(s);
}
int main()
{
    char s[1024];
    itob(75, s, 16);  //当b为16,输出有问题?
    printf("%s\n", s);
    return 0;
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧