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