尝试在 C 中执行简单的 do_operation 函数

Trying to do simple do_operation function in C

作为初学者,我尝试在 C 中尝试一个非常简单的操作函数有点疯狂,但似乎我尝试的一切都失败了,尽管它应该可以工作。

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

int     calcul(int nb1, int nb2, char *av)
{
        int nb = 0;
        if (av[2] == '*')
                nb = nb1 * nb2;
        if (av[2] == '%')
                nb = nb1 % nb2;
        if (av[2] == '/')
                nb = nb1 / nb2;
        if (av[2] == '+')
                nb = nb1 + nb2;
        if (av[2] == '-')
                nb = nb1 - nb2;
        return (nb);
}

int     atoi();

int     main(int ac, char **av)
{
        printf("%s", av[2]);
        if (ac == 4)
                printf("%d", calcul(atoi(av[1]), atoi(av[3]), av[2]));
        return (0);
}

似乎在第二个参数(即运算符)通过 calcul 函数时,它会将实际字符更改为它的 ASCII 值或其他值,因此无法在条件。

我已经尝试 fiddle 很多方法并查找其他片段,但这正是他们所做的以及它应该如何工作(即使我删除了 printf),那我做错了什么?

EDIT 抱歉,我故意更改参数的数量以获得其他内容的段错误,这是我正在测试的 "correct" 函数问题。

此外,我使用此功能的方式是 运行 在 shell:

中采用这种格式的简单编译程序
./a.out 2 * 3

SOLVED 正如@Mike 在进入计算函数时指出的那样,运算符 av[2] 现在被认为是第一个也是唯一的字符参数,因此要被识别与 av[0]。这有点confusing/tricky.

您的索引有误。假设您想打印运算符字符以确保它正常工作,我稍微更改了代码。

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

int     calcul(int nb1, int nb2, char *av)
{
        int nb = 0;
        printf("%c\n", av[0]);
        if (av[0] == '*')
                nb = nb1 * nb2;
        if (av[0] == '%')
                nb = nb1 % nb2;
        if (av[0] == '/')
                nb = nb1 / nb2;
        if (av[0] == '+')
                nb = nb1 + nb2;
        if (av[0] == '-')
                nb = nb1 - nb2;
        return (nb);
}

int     main(int ac, char **av)
{
        printf("%s\n", av[2]);
        if (ac == 4)
                printf("%d\n", calcul(atoi(av[1]), atoi(av[3]), av[2]));
        return (0);
}

请注意,在您的 calcul 函数中,您正在调用 av[2],这是试图获取仅包含 NULL 运算符字符的字符串的第三个索引。

预计到达时间:

还有关于 * 运算符的注释。要使其正常工作,您需要使用转义字符 \.

来调用它

预计到达时间 2:

更改了代码以匹配答案中的编辑,以便可以通过以下方式调用它:

./a 3 + 4
./a 3 '*' 9

只是在评论中跟进您的问题...

参数作为字符串数组传递给 c 程序;也就是说,一个字符串列表。 c 字符串是字符列表,因此字符串列表是二维数组或字符矩阵。每个字符串都有一个索引。字符串中的每个 char 都有一个索引您可以将其可视化为网格:

                           Index of char in string
                         _|_0_|_1_|_2_|_3_|_4_|_5_| ... etc
                         0|___|___|___|___|___|___|___
                         1|___|___|___|___|___|___|___
                         2|___|___|___|___|___|___|___
Index of string in list  3|___|___|___|___|___|___|___
                         4|___|___|___|___|___|___|___
                         5|___|___|___|___|___|___|___
                        ... etc

因此,如果您调用程序 ./a.out 3 '*' 9char** av 将包含 4 个字符串:

av[0] = "a.out"
av[1] = "3"
av[2] = "*"
av[3] = "9"

当然,c 字符串以 NULL 结尾,因此在网格视图中,您会看到

                           Index of char in string
                         _|_0_|_1_|_2_|_3_|_4_|_5_| ... etc
                         0|_a_|_._|_o_|_u_|_t_|[=12=]_|___
                         1|_3_|[=12=]_|___|___|___|___|___
                         2|_*_|[=12=]_|___|___|___|___|___
Index of string in list  3|_9_|[=12=]_|___|___|___|___|___
                         4|___|___|___|___|___|___|___
                         5|___|___|___|___|___|___|___    
                        ... etc

每个字符串的第一个字符从索引 0 开始;例如,字符串 0,字符 0 是 'a',或

av[0][0] = 'a'
av[1][0] = '3'
av[2][0] = '*'
av[3][0] = '9'

因此,当您将 av[2] 传递给您的函数时,您将 char* 传递给整个第 3 个字符串参数(在本例中仅包含 1 个 char* 个字符)。因此,在 calcul 函数中,Mike 正确地检查了字符串的第一个 char,这是运算符所在的位置。在 calcul 函数中,av[1] 包含字符串终止符 NULL 字节 [=28=],并且 av[2] 和更高版本是未定义的索引。我建议将 calcul 函数中 av 参数的名称更改为其他名称,这样您就不会将它与 main.

中的 av 参数混淆

请记住,在这种情况下,char** av 是一个字符串列表(其中每个索引 0、1、2 等指向该列表中的一个字符串,而 char* av 是单个字符串字符串(其中每个索引 0、1、2 等寻址该字符串中的一个字符)。