簡體   English   中英

如何在沒有任何幫助功能的情況下將負十進制數轉換為八進制基數

[英]How to convert a negative decimal number to octal base without any helping funtions

我正在實現 printf function 並且現在被困在將負基數 10 數字轉換為基數 8 八進制數,下面我放置了一段代碼,它在將正十進制數轉換為八進制時工作得很好像 printf

我的 ft_printf => 15 八進制 => 017

原裝 printf => 15 八進制 => 017

但關於負數:

我的 ft_printf => -15 八進制 => 0-17

原始 printf => -15 八進制 => 037777777761

我應該用我的 function 修改什么,以便它像 printf 一樣打印負數謝謝!

void    process_octal(unsigned int n)
{
    char    *str;
    int     oct = 0;
    int     rem = 0;
    int     place = 1;

    while (n)
    {
        rem = n % 8;
        oct = oct + rem * place;
        n = n / 8;
        place = place * 10;    
    }
    str = ft_itoa(oct);
    ft_putstr_fd(str, 1);
}

這是一個非常簡單的 function 將數字轉換為任何基數(限於可用數字符號的數量)。

char *reverse(char *ptr, size_t length)
{
    char *str = ptr;
    if(ptr && length)
    {
        char *end = ptr + length - 1;
        while(end > str)
        {
            char tmp = *str;
            *str++ = *end;
            *end-- = tmp;
        }
    }
    return ptr;
}


char *convert(char *buff, long long val, unsigned base)
{
    const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVXYZ";
    int negative = val < 0;
    size_t count = 0;

    if(base < 2 || base > sizeof(digits) - 1) return NULL;

    do
    {
        buff[count++] = digits[abs(val % base)];
        val /= base;
    }while(val);
    if(negative) buff[count++] = '-';
    buff[count] = 0;
    return reverse(buff, count);
    
}

https://godbolt.org/z/Wz15h4x41

OP評論后:

function 將根據asUnsigned參數打印值的有符號或無符號表示:

char *convert(char *buff, long long val, unsigned base, int asUnsigned)
{
    const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVXYZ";
    int negative = val < 0;
    size_t count = 0;

    if(base < 2 || base > sizeof(digits) - 1) return NULL;

    do
    {
        buff[count++] = digits[asUnsigned ? ((unsigned)val) % base : abs(val % base)];
        val = (asUnsigned ? (unsigned)val : val) / base;
    }while(val);
    if(!asUnsigned && negative) buff[count++] = '-';
    buff[count] = 0;
    return reverse(buff, count);
    
}

https://godbolt.org/z/MdMGerTTs

int main(void) {
    char str[32];
    printf("%s\n", convert(str, -15, 8, 1));  
    printf("%s\n", convert(str, -15, 8, 0));  

}

結果:

37777777761
-17

我正在實施 printf function ,現在卡在將負基數 10 轉換為基數 8 八進制數

這意味着 OP 錯誤地獲得了論點。

對於"%o""%x""%X""%u" ,對應的參數是unsigned類型,而不是int

使用適當的printf() ,不會打印帶有說明符oxXu簽名integer 。

嘗試傳遞否定的 integer 以匹配oxXu的代碼會導致未定義的行為(UB)。 一個常見的 UB 是將帶符號的參數視為無符號的。

暫無
暫無

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

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