簡體   English   中英

將基數20轉換為int

[英]Converting base 20 to int

我試圖將基數20轉換為int 例如,如果我有"1A"則需要將其轉換為30 ,依此類推。 我已經開發了代碼,但是在運行中卻出現了問題。 代碼如下使用C編程語言:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("Hello world!\n");
    char converted[20] = "1A";
    itov(converted);

    return 0;
}

void itov(char vigesimalStr[])
{
    int length = 0;
    for (int i = 0; vigesimalStr[i] != '\0'; i++)
    {
        length++;
    }

    int base = 20;
    int result = 0;
    int power = 1;
    int num = 0;
    for (int j = length; j >= 0; j--)
    {
        if (val(vigesimalStr[j]) >= base)
        {
            printf("Invalid Number");
            return -1;
        }

        num += val(vigesimalStr[j]) * power;
        power = power * base;

    }

}

int val(char c)
{
    if (c >= '0' && c <= '9')
        return (int)c - '0';
    else
        return (int)c - 'A' + 10;
}

首先,我要說明一個明顯的問題,已經有一個庫函數可以將包含任何基數的字符串從(我相信)2轉換為36:

printf("%ld\n", strtol("1A", NULL, 20));
// Output: 30

但是,如果作為練習或家庭作業的一部分,禁止使用此函數和類似的庫函數,則我不會為您做家庭作業,而是向您介紹在其中讀取整數的高級算法。任意基數N:

  1. accumulator變量初始化為零。
  2. 將計數變量i初始化為0
  3. accumulator乘以N。
  4. 獲取str[i]當前以N為底的數字的數值,並將其添加到accumulator (您的val函數)。
  5. 遞增i
  6. 如果str[i]'\\0' ,則返回accumulator並退出。 否則,請轉到步驟3。

我在您的代碼中看到了兩個關鍵問題:

void itov(char vigesimalStr[])
// ...
    return -1;

如果錯誤返回-1,則itov()函數不能為void 成功也不會返回正確的值!

for (int j = length; j >= 0; j--)

向后運行序列時,您要從length - 1開始length - 1因為length本身永遠不是有效的索引,因為它是最后一個索引加一個。

下面是對代碼的重做,修復了上述問題,並整理了其他一些較小的問題:

#include <stdio.h>
#include <stdlib.h>

#define BASE 20

int val(char c)
{
    if ('0' <= c && c <= '9')
        return c - '0';

    return c - 'A' + 10;
}

int itov(char vigesimalStr[])
{
    int length = 0;

    for (length = 0; vigesimalStr[length] != '\0'; length++)
    {
        // nothing to see here
    }

    int power = 1;
    int number = 0;

    for (int j = length - 1; j >= 0; j--)
    {
        int digit = val(vigesimalStr[j]);

        if (digit >= BASE)
        {
            fprintf(stderr, "Invalid Number\n");
            return -1;
        }

        number += digit * power;
        power *= BASE;
    }

    return number;
}

int main()
{
    char to_convert[20] = "1A";

    printf("%d\n", itov(to_convert));

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM