C:创建一个函数来显示数字,只需要“write”函数

daolsyd0  于 2023-04-11  发布在  其他
关注(0)|答案(5)|浏览(117)

我如何编写一个基本的函数,只是用#include<unistd.h>中包含的“write”函数,来显示一个数字?
例如:
ft_putnbr.c

int ft_putnbr(int nbr)
{
    write(1, &nbr, sizeof(int));
    return (0);
}

int ft_putchar(char c)
{
    write(1, &c, 1);
    return (0);
}

main.c

int     ft_putnbr(int nbr);
int     ft_putchar(char c);

int     main(void)
{
    ft_putnbr(6);
    ft_putchar('\n');
    ft_putchar('a');
    return (0);
}

ft_putchar工作正常,但我想用我的“ft_putnbr”函数对一个数字做同样的事情。
当我编译或执行软件时没有错误,但显示的是一个空白而不是我的数字。

acruukt9

acruukt91#

您必须将int转换为char*表示(ASCII转换)。例如:

int nbr = 1234;
char str[16]; /* max size expected: 15 digits + 1 null character */
sprintf(str, "%d", nbr);

然后:

write(1, str, strlen(str));

你需要包括这些:

#include <stdio.h>
#include <string.h>
rjee0c15

rjee0c152#

我用这个:

void        ft_putnbr(int nbr)
{
    if (nbr < 0)
    {
        ft_putchar('-');
        ft_putnbr(-nbr);
    }
    else if (nbr > 9)
    {
        ft_putnbr(nbr / 10);
        ft_putnbr(nbr % 10);
    }
    else
    {
        ft_putchar(nbr + '0');
    }
}
xzv2uavs

xzv2uavs3#

这一个也检查int_min和int_max

void    ft_putnbr(int nb)
{
    if (nb == -2147483648)
    {
        ft_putchar('-');
        ft_putchar('2');
        ft_putnbr(147483648);
    }
    else if (nb < 0)
    {
        ft_putchar('-');
        ft_putnbr(-nb);
    }
    else if (nb > 9)
    {
        ft_putnbr(nb / 10);
        ft_putnbr(nb % 10);
    }
    else
        ft_putchar(nb + '0');
}
huus2vyu

huus2vyu4#

库putnbr()

我们在公共图书馆中没有任何类似的函数,我们只是使用printf。

ft_putnbr

这个函数将在标准输出上显示整数n。这个函数类似于ft_itoa函数,因为我们将递归地执行它。我们将把整数作为一个整体分解为单个的个位数,我们将把这些整数转换为字符。我们将使用ft_putchar函数在标准输出上显示这些字符。
所以这个函数不需要返回任何值。但是需要number来完成它的使命。我们将像这样声明函数:

void ft_putnbr(int nbr)
{

}

在函数体中,我们首先查看传入参数的int是否等于-2147483648。2147483648这个数字是int变量可能容纳的最大数字。当负号放在它前面时,我们的函数无法处理它。所以我们检查是否给出了负版本,如果是,我们立即返回它

void ft_putnbr(int nbr)
{
    if (nbr == -2147483648)
    {
        ft_putstr("-2147483648");
    }
}

因此,如果nbr不等于-2147483648,我们将检查另一个条件,如果nbr是负数。如果number是last than 0 .我们将立即使用ft_putchar(-)显示标准输出的减号。我们将调用ft_putnbr()再次对变量n的负版本。在数学中-(-5)= 5,因此我们将使用此www.example.com使其为正Method.so我们将这样做:

void ft_putnbr(int nbr)
{
    if (nbr == -2147483648)
    {
        ft_putstr("-2147483648");
    }
    else if (nbr < 0)
    {
        ft_putchar();
        ft_putnbr(-nbr);
    }
}

如果我们给定的数字不是负数,那么我们将移动到下一个else if,并且我们将检查该数字是否大于或等于10。如果是,则我们开始递归地将该数字分解为每个单独的数字,然后我们将其转换为字符。所以我们将使用10的除法和10的模数。除以10将使我们进一步进入递归,直到我们最终到达int中的第一个数字。如果您查看模数10,我们使用a + 48将数字转换为char值。虽然这看起来会立即将其放入标准输出,我们将在这个数字上使用ft_putchar来在标准输出上显示它,然后通过我们的递归进行回溯,直到每个数字都被显示出来。

void ft_putnbr(int nbr)
{
    if (nbr == -2147483648)
    {
        ft_putstr("-2147483648");
    }
    else if (nbr < 0)
    {
        ft_putchar();
        ft_putnbr(-nbr);
    }
    else if (nbr >= 10)
    {
        ft_putnbr(nbr / 10);
        ft_putchar(nbr % 10 + 48);
    }
    else 
    {
        ft_putchar(nbr + 48);
    }
}

备注:

如果你在理解recusion方面有任何困难,你应该在一张纸上写出这个函数将采取的步骤。

#include <unistd.h>

void ft_putnbr(int nbr)
{
    if (nbr == -2147483648)
    {
        ft_putstr("-2147483648");
    }
    else if (nbr < 0)
    {
        ft_putchar();
        ft_putnbr(-nbr);
    }
    else if (nbr >= 10)
    {
        ft_putnbr(nbr / 10);
        ft_putchar(nbr % 10 + '0');
    }
    else 
    {
        ft_putchar(nbr + '0');
    }
}

为了测试我的代码,我将使用这个简单的main函数

int main ()
{
int a = 555;
ft_putnbr(a);
}
nwo49xxi

nwo49xxi5#

你可以使用递归:

//recursion solution:
void    ft_putnbr_fd(int n, int fd)
{
    long int    nb;
    char        c; //place holder for write();

    if (fd < 0)
        return ;
    nb = n;
    if (nb < 0)
    {
        write(fd, "-",1);
        nb *= -1;
    }
    if (nb < 10)
    {
        c = nb + '0';
        write(fd, &c, 1);
    }
    else
    {
        ft_putnbr_fd(nb / 10, fd);
        c = nb % 10 + '0';
        write(fd, &c, 1);
    }
}

然而,在我看来,更优雅、更简单的方法是使用for()while()循环:

//while loop solution:
void    ft_putnbr_fd(int n, int fd)
{
    int     mod;
    char    c;

    if (n == 0)
        write(fd, "0", 1);
    if (n == -2147483648)
        write(fd, "-2147483648", 11);
    if (fd < 0 || n == 0 || n == -2147483648)
        return ;
    if (n < 0)
    {
        write(fd, "-", 1);
        n *= -1;
    }
    mod = 1000000000;
    while (mod && mod > n)
        mod = mod / 10;
    while (mod)
    {
        c = n / mod + '0';
        write(fd, &c, 1);
        n = n % mod;
        mod = mod / 10;
    }
}

正如你所看到的,这两种解决方案都只需要write(int fd, const void *buf, size_t nbyte)函数<unistd.h>。while循环解决方案,通过删除第一个while循环,它也将打印前导0。希望这对你有帮助!

相关问题