尝试在 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 '*' 9
,char** 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 等寻址该字符串中的一个字符)。
作为初学者,我尝试在 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 '*' 9
,char** 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 等寻址该字符串中的一个字符)。