Ошибка с * в качестве аргумента - PullRequest
0 голосов
/ 31 марта 2020

Я новичок и пытаюсь выучить немного c. Я создаю программу для изучения указателя на функции, и при запуске я даю ей три аргумента: int, оператор и другой int. Все отлично работает с%, -, + и /. Но для * у меня есть очень странная ошибка. После большого количества write () везде, чтобы найти, где начинается ошибка, я обнаружил, что это в самом начале: когда я отображаю argv [2] [0], он отображает хороший символ для всего, кроме *, где он показывает "Makefile" ... Я действительно не понимаю эту проблему, и я не нахожу ничего, связанного с * и аргументами ошибок. Я даже не ошибаюсь в указателях или других вещах, так как это с самого начала.

Вот начало кода, так что вы можете увидеть:

#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"...

И некоторый вывод :( сначала представление символа, затем число символов, затем в другой раз представление символа, но дальше в коде, а затем результат * всегда равен 0, потому что он просто выходит из основного после того, как не выполнил никаких следующих условий)

➜  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, тот же результат. На всякий случай вот make-файл:

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)

Спасибо

1 Ответ

1 голос
/ 31 марта 2020

Ваша C программа не получает * в качестве аргумента, потому что ваша оболочка расширяет его в первую очередь. Вам нужно использовать его как '*' или \* при вызове вашей программы: exercice05 ./ft_op 100 '*' 5 или exercice05 ./ft_op 100 \* 5

Сравните выходные значения echo *, echo '*' и echo \*, чтобы сделать это более ясно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...