簡體   English   中英

如何將具有 2 位或更多位數字的 integer 顯示為字符串?

[英]How can I display integer that has 2 or more digits as a string?

我的任務是創建一個 function 來顯示作為參數輸入的數字。 function 必須能夠顯示int類型變量中的所有可能值。 write()是唯一允許的 function。

void ft_putchar(char c)    
{
    write(1, &c, 1);
}

void ft_putnbr(int nb)
{
    if (nb < 0)
    {
        ft_putchar('-');

        ft_putchar(-nb + '0');
    }

    if ( nb > 0)
    {
        ft_putchar(nb + '0');
    }
}

我寫了這個,但顯然它不適用於具有 2 位或更多位的整數,我怎樣才能將它們顯示為字符串?

write 是唯一允許的 function。

更通用的解決方案是使用循環來處理 10 秒、100 秒等。嘗試除以 10 的最大冪,然后除以 1/10 等。

處理所有int有點棘手。 請注意執行-INT_MIN的代碼,因為那是未定義的行為(UB)。 相反,在打印符號后使用int的負側,因為負int比正 int 多。

#if INT_MAX == 2147483647
#  define INT_POW_MAX (1000 * 1000 * 1000)
#elif INT_MAX == 32767
#  define INT_POW_MAX (10 * 1000)
#else
// For greater portability, additional code needed
#  error "TBD code"
#endif

void ft_putnbr(int nb) {
  if (nb < 0) {
    // Do not use -nb as that is UB when nb == INT_MIN
    ft_putchar('-');
  } else {
    nb = -nb;
  }
  // At this point, nb <= 0
  int pow10n = -INT_POW_MAX;

  // Skip leading 0 digits.
  while (pow10n < nb) {
    pow10n /= 10;
  }

  // Print the rest.
  do {
    int q = pow10n ? nb/pow10n : nb;
    ft_putchar(q + '0');
    nb -= q*pow10n;
    pow10n /= 10;
  } while (pow10n);
}

通過測試工具

候選解決方案的測試工具:

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

#define ft_putchar putchar

void ft_putnbr(int nb) {
  // Your code here
}

void test(int i) {
  printf("%12d ", i);
  ft_putnbr(i);
  printf("\n");
}

int main() {
  int a[] = { INT_MIN, 0, 1, 2, 9, 10, 11,42, INT_MAX - 1, INT_MAX };
  size_t n = sizeof a / sizeof a[0];
  for (size_t i = 0; i < n ; i++) {
    if (a[i] > 0) test(-a[i]);
    test(a[i]);
  }
}

預期 output

 -2147483648 -2147483648
           0 0
          -1 -1
           1 1
          -2 -2
           2 2
          -9 -9
           9 9
         -10 -10
          10 10
         -11 -11
          11 11
         -42 -42
          42 42
 -2147483646 -2147483646
  2147483646 2147483646
 -2147483647 -2147483647
  2147483647 2147483647

遞歸解決方案。

它還避免了-INT_MIN

void putint(int nb) {
  if (nb < 0) {
    ft_putchar('-');
    if (nb == INT_MIN) {
      putint(nb / -10);
      nb %= -10;
    }
    nb = -nb;
  }
  if (nb >= 10) {
    putint(nb/ 10);
    nb %= 10;
  }
  ft_putchar(nb + '0');
}

暫無
暫無

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

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