我正在尝试将int转换为vigesimal基数是20。vigesimal数字系统是基数20。数字是‘0’,。。.,‘9’,‘A’,.。.,‘J’。我已经用C语言编写了代码来执行从Int到vigesimal base的转换。但是我没有得到正确的输出。下面是我的代码。
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello world!\n");
itov('hey',30);
return 0;
}
void itov(char vigesimalStr [],int n)
{
char base_digits[21] =
{'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F','G','H','I','J'};
int index=0;
int base=20;
while (n != 0)
{
vigesimalStr[index]= n % base;
n = n / base;
++index;
}
/* now print the result in reverse order */
--index; /* back up to last entry in the array */
printf("\n\nConverted Number = ");
for( ; index>=0; index--) /* go backward through array */
{
printf("%c", base_digits[vigesimalStr[index]]);
}
printf("\n");
}
发布于 2019-03-05 14:22:04
以下是第一个错误:(可能还有更多错误)
itov('hey',30);
/* ^ ^ */
首先,单引号用于int
类型的字符文字。你应该使用双引号来表示字符串文字,这与char []
兼容(实际上耗尽为char *
)。这样的字符串文字的类型是const char [SIZE]
。
其次,因为文字的类型是const
,所以需要传递一个可变的char
数组。
对于ex:
char converted[20] = {0};
itov(converted,30);
--
你应该在第一次使用之前声明itov
的类型是正常的,并避免一些令人讨厌的意外。
发布于 2019-03-05 14:51:28
此代码适用于正数:
#include <stdio.h>
#include <stdlib.h>
static void itov(char vigesimalStr[], int n);
int main(void)
{
int tests[] = { 30, 0, 1, 19, 20, 21, 399, 400, 401, 379341, };
enum { NUM_TESTS = sizeof(tests) / sizeof(tests[0]) };
printf("Hello world!\n");
for (int i = 0; i < NUM_TESTS; i++)
{
char result[32];
itov(result, tests[i]);
printf("%6d = %5s base 20\n", tests[i], result);
}
return 0;
}
static void itov(char vigesimalStr[], int n)
{
char base_digits[20] =
{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
};
int index = 0;
int base = 20;
do
{
vigesimalStr[index++] = base_digits[n % base];
n = n / base;
} while (n != 0);
vigesimalStr[index--] = '\0';
for (int i = 0; i < index; i++, index--)
{
char t = vigesimalStr[i];
vigesimalStr[i] = vigesimalStr[index];
vigesimalStr[index] = t;
}
}
输出为:
Hello world!
30 = 1A base 20
0 = 0 base 20
1 = 1 base 20
19 = J base 20
20 = 10 base 20
21 = 11 base 20
399 = JJ base 20
400 = 100 base 20
401 = 101 base 20
379341 = 27871 base 20
请注意,转换函数不执行任何打印-这使得它更具通用性。函数接口没有提供确保目标字符串不溢出的机制;用户有责任提供足够大的字符串来保存结果。
处理负数更加棘手-完全可行,但也更加棘手,因为在正常的二进制补码系统中,您不能否定INT_MIN
并获得正值。但是,您可以否定任何正值,然后对其进行处理。
https://stackoverflow.com/questions/54996529
复制相似问题