首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Integer到Vigesimal字符串

Integer到Vigesimal字符串
EN

Stack Overflow用户
提问于 2019-03-05 14:17:44
回答 2查看 155关注 0票数 0

我正在尝试将int转换为vigesimal基数是20。vigesimal数字系统是基数20。数字是‘0’,。。.,‘9’,‘A’,.。.,‘J’。我已经用C语言编写了代码来执行从Int到vigesimal base的转换。但是我没有得到正确的输出。下面是我的代码。

代码语言:javascript
运行
复制
 #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");

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-05 14:22:04

以下是第一个错误:(可能还有更多错误)

代码语言:javascript
运行
复制
itov('hey',30);
/*   ^   ^     */

首先,单引号用于int类型的字符文字。你应该使用双引号来表示字符串文字,这与char []兼容(实际上耗尽为char *)。这样的字符串文字的类型是const char [SIZE]

其次,因为文字的类型是const,所以需要传递一个可变的char数组。

对于ex:

代码语言:javascript
运行
复制
char converted[20] = {0};
itov(converted,30);

--

你应该在第一次使用之前声明itov的类型是正常的,并避免一些令人讨厌的意外。

票数 2
EN

Stack Overflow用户

发布于 2019-03-05 14:51:28

此代码适用于正数:

代码语言:javascript
运行
复制
#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;
    }
}

输出为:

代码语言:javascript
运行
复制
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并获得正值。但是,您可以否定任何正值,然后对其进行处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54996529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档