首页 > 解决方案 > 以 ' * ' 作为参数的错误

问题描述

我是初学者,并尝试学习一些 c。我编写了一个程序来学习函数指针,并在启动时为程序提供 3 个参数:一个 int、一个运算符和另一个 int。使用 %、-、+ 和 / 一切正常。但是对于 * 我有一个非常奇怪的错误。经过大量的 write() 到处寻找它开始出错的地方后,我发现它在一开始:当我显示 argv[2][0] 时,它会显示除 * 之外的所有内容的好字符显示“Makefile”...我真的不明白这个问题,我没有找到任何与 * 和 arguments 错误相关的东西。我什至不会在指针或其他东西上出错,因为它从一开始就是。

这是代码的开头,因此您可以看到:

#include"header.h"

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_putstr(char *str)
{
    int i;

    i = 0;
    while (str[i] != '\0')
    {
        ft_putchar(str[i]);
        i++;
    }
}

int main(int argc, char **argv)
{
    int a;
    int b;
    char    operator;

    ft_putchar(argv[2]); //here it shows "Makefile"...

还有一些输出:(首先是 char 表示,然后是字符数,然后是 char 表示,但在代码中更远,然后是结果,* 始终为 0,因为它只是在接下来不遵循任何条件后退出 main)

➜  exercice05 ./ft_op 100 / 5
/1/20
➜  exercice05 ./ft_op 100 + 5
+1+105
➜  exercice05 ./ft_op 100 - 5
-1-95
➜  exercice05 ./ft_op 100 % 5
%1%0
➜  exercice05 ./ft_op 100 * 5
Makefile80

这个错误是如此奇怪,我只能想象它是显而易见的,但我现在一无所知。我的目录中确实有一个 Makefile,但我真的不知道问题出在哪里。我在 macOS Catalina 上,尝试过 bash 和 zsh,结果相同。以防万一这是makefile:

TARGET = ft_op
SRC = $(wildcard *.c)
OBJ = $(SRC:.c =.o)
FLAG = -Wall -Wextra -Werror
CC = gcc

$(TARGET): $(OBJ)
    $(CC) $(FLAG) $^  -o $@

.PHONY: clean fclean

clean:
    rm -f *.o
fclean: clean
    rm -f $(TARGET)

谢谢

标签: ccommand-line-arguments

解决方案


您的 C 程序没有*作为参数,因为您的外壳首先扩展它。您需要在调用程序时或调用程序时使用'*'\*exercice05 ./ft_op 100 '*' 5exercice05 ./ft_op 100 \* 5

比较 和 的输出,echo *使其更清晰。echo '*'echo \*


推荐阅读