我用Java做了很多,但我现在正在努力学习c。我正在尝试制作一个程序,将数字从十进制转换为二进制。
这就是我所拥有的:
#include <stdio.h>
#define LENGTH 33
int main( int argc, char*argv[ ] )
{
unsigned int number, base, remainder, x, i;
char result[LENGTH];
puts( "Enter a decimal value, and a desired base: " );
scanf( " %u", &number );
scanf( " %u", &base );
x = number;
for( i=0; i < LENGTH; i++ )
{
remainder = x % base;
x = x/base;
result[i] = remainder;
}
printf( "%u equals %s (base-%u) \n", number, result, base );
//***result is probably backwards...
return 0;
}
以下是我运行时的结果:
Enter a decimal value, and a desired base:
5 2
5 equals (base-2)
什么是正方形以及如何将其显示为字符串(字符数组)?
答案 0 :(得分:4)
上次修改:您的程序可能如下所示:
unsigned int number, base, remainder, x, i;
char result[LENGTH+1] = {0};
puts( "Enter a decimal value, and a desired base: " );
scanf( " %u", &number );
scanf( " %u", &base );
x = number;
for( i=0; i < LENGTH; i++ )
{
// if base > 10, use alphabet!
result[i] = remainder > 9 ? (remainder-10) + 'A' : remainder + '0';
x = x/base;
result[i] = remainder + '0';
}
首先,在写入余数时,应该添加数字的ASCII偏移量。
result[i] = remainder + '0';
另外,您忘了在最后添加'\0'
。
result[i] = 0;
printf( "%u equals %s (base-%u) \n", number, result, base );
编辑:写入c-string时,我通常会将字符串初始化为零:
char result[LENGTH] = {0};
这样你最后不需要写null character
,而是为你写的。
感谢@mmyers指出溢出:)
我会声明要保留LENGTH+1
的字符串:
char result[LENGTH+1] = {0};
答案 1 :(得分:4)
您希望将数字存储为result[i]
中的字符,而不是剩余的实际数字。对于(例如)16的基数,一种方法是索引到具有所需数字的辅助数组(可以是字符串文字)。
char digits[] = "0123456789ABCDEF";
/* stuff */
result[i] = digits[remainder];
/* more stuff */
此外,告诉您null终止字符串的其他注释完全正确。
编辑:无论您走哪条路线,都应确保base
的值输入大于0且不大于您希望处理的最大值。
答案 2 :(得分:1)
您需要确保您的字符串在终端上显示的值介于32和127之间。
for( i=0; i < LENGTH; i++ )
{
remainder = x % base;
x = x/base;
result[i] = remainder;
}
在本节中,您将小值放入数组中,因此它不会显示为ASCII字母。
您可能只想拥有以下内容: 结果[i] =余数+'0';
一种简单的方法是打印出字符串各部分的ascii值,看看它是什么值。
答案 3 :(得分:0)
这是学术练习吗?如果没有多少C编译器库包含完全符合您需要的itoa()函数。它不是由ISO标准C库定义的,但通常包含在大多数编译器中。