c语言 - 如何将具有 2 个或更多数字的整数显示为字符串?



我的任务是创建一个函数,将输入的数字显示为参数。该函数必须能够显示int类型变量中的所有可能值。write()是唯一允许的功能。

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 是唯一允许的函数。

更通用的解决方案是使用循环来处理 10、100 等。 尝试除以 10 的最大幂,然后除以 1/10,依此类推。

处理所有int有点棘手。 当心-INT_MIN的代码,因为这是未定义的行为(UB)。 相反,请在打印标志后使用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]);
}
}

预期产出

-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');
}

最新更新