【问题标题】:Create a Function that displays N or P depending on integer entered创建一个根据输入的整数显示 N 或 P 的函数
【发布时间】:2021-07-05 14:20:20
【问题描述】:

哟!所以我开始学习如何自己编码,对于这个练习,我必须创建一个函数,根据作为参数输入的整数符号显示“N”或“P”。如果 n 为负数,则显示“N”。如果 n 为正数或空值,则显示“P”。我已经设法做到了,并提出了一个可行的主要方法。允许的函数被写入(没有 atoi 等)

void    ft_is_negative(int n)
{
    if (n >= 0)
    {
        write(1, "P", 1);
    }
    else
    {
        write(1, "N", 1);
    }
}

   int  main()
{
    int i;

    i = 200;
    ft_is_negative(i);
}

但是我一直在努力习惯在我的 main 中使用参数,但是当我使用它们时我一直在努力获得一个正常工作的 main。在这里,有了这个,我只是得到了马车(“\n”),我就是不知道为什么(这可能很明显,但我看不到)。提前感谢您的帮助,如果您不想直接给我答案,请指出正确的方向。

void    ft_is_negative(int n)
{
    if (n >= 0)
    {
        write(1, "P", 1);
    }
    else
    {
        write(1, "N", 1);
    }
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        while (argv[1])
        {
            ft_is_negative(*argv[1]);
        }
    }
    write(1, "\n", 1);
    return 0;
}

【问题讨论】:

  • if (argc != 2) 检查这个条件。尝试给出 2 个参数(lile ./a.out hoge fuga),你会得到一个无限的 Ps 或 Ns。
  • 如果argc==2(因此 argv[1] 可用)而不是argc!=2(argv[1] 可能不可用),您可能想要执行您的操作。我不明白你的 while 循环的意图。但我假设您期望像./program -123 这样的输入,所以您可能想要传递类似atoi(argv[1])(整数-123)而不是*argv[1],这将是输入的第一个字符的值(破折号的值45字符)。
  • 是否允许使用标准库函数(如atoi())?
  • @MikeCAT no 不允许使用标准库函数(很确定我必须自己编写一个 atoi 代码)
  • @MikeCAT 你是对的,当我设置 (argc == 2) 时确实会出现无限循环,所以我可能做错了什么

标签: c arguments


【解决方案1】:
  • if (argc != 2) 是错误的。如果您想检查是否只给出了 1 个参数,它应该是 if (argc == 2)
  • while (argv[1]) 是错误的。这可能是一个无限循环,因为argv[1] 没有在循环中更新。

要检查传递的值是否为负,您应该检查:

  • 如果第一个字符是-
  • 后面还有0以外的字符
  • 没有无效字符

可以这样做:

int main(int argc, char *argv[])
{
    if (argc == 2)
    {
        char* p = argv[1];
        int is_minus = 0, contain_nonzero = 0, contain_invalid = 0, contain_valid = 0;
        if (*p == '-')
        {
            is_minus = 1;
            p++;
        }
        else if (*p == '+')
        {
            p++;
        }
        for (; *p != '\0'; p++)
        {
            if ('0' <= *p && *p <= '9')
            {
                contain_valid = 1;
                if (*p != '0') contain_nonzero = 1;
            }
            else
            {
                contain_invalid = 1;
            }
        }
        if (contain_invalid || !contain_valid)
        {
            /* contain invalid character or no character (except for sign) */
            write(1, "invalid", 7);
        }
        else if (is_minus && contain_nonzero)
        {
            /* contain minus sign and nonzero digit */
            ft_is_negative(-1);
        }
        else
        {
            /* contain digit, positive or zero (including minus zero) */
            ft_is_negative(0);
        }
    }
    write(1, "\n", 1);
    return 0;
}

【讨论】:

  • 谢谢!我知道我哪里出错了
猜你喜欢
  • 2012-06-25
  • 1970-01-01
  • 2021-08-30
  • 2013-05-16
  • 1970-01-01
  • 2013-10-02
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多