[英]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.