C календарная структура - PullRequest
0 голосов
/ 03 мая 2009

Может ли кто-нибудь быстро взглянуть на этот C-код и понять, почему я получаю ошибку компилятора? Это функция для ввода деталей в структуру календаря, которая должна создавать один узел, то есть одно «событие» в календаре.

struct event enter_key(void)
{
        int day,month,year,starttime,endtime,length;
        char* descp;
    struct event* n;

        printf("Enter Day:\n");
        scanf("%d", &day);
        printf("Enter Month:\n");
        scanf("%d", &month);
        printf("Enter Year: \n");
        scanf("%d", &year);
        printf("Enter starttime:\n"); scanf("%d", &starttime);
        printf("Enter endtime:\n");
        scanf("%d", &endtime);
        printf("Enter Description: \n");
        scanf("%s", &descp);


        n=mkevent(day, month, year, starttime, endtime, &descp);

При попытке компиляции я получил это сообщение:

newpro.c: 115: предупреждение: прохождение аргумент 6 'mkevent' из несовместимый тип указателя

Может ли кто-нибудь сказать мне, если я неправильно объявляю указатель, или я должен выделить место для указателя 'descp', или я попытался создать узел в структуре неправильным образом?

Спасибо за чтение, С новичком.

Ответы [ 5 ]

2 голосов
/ 03 мая 2009

Указатель должен указывать на буфер, достаточно большой для значения, которое пользователь вводит в вызове scanf.

  %s      Matches  a  sequence of non-white-space characters;
          the next pointer must be a pointer to char, and the
          array  must  be  large  enough  to  accept  all the
          sequence and the terminating  NUL  character.   The
          input string stops at white space or at the maximum
          field width, whichever occurs first.

Так что это может быть что-то вроде

char descp[ MAX_DESCRIPT ];

scanf("%s", descp);

Хотя в реальном коде вы должны использовать один из методов для чтения строк, которые не могут привести к переполнению буфера (а также к возможному требованию пользователя ввести описания, содержащие пробелы).

Я пытался создать узел в структуре неправильно?

Я не знаю сигнатуру mkevent, но я ожидаю, что в качестве описания она будет принимать указатель на строковый буфер (const char*), а не указатель на указатель на строку (передать * 1015) * вместо &descp).

1 голос
/ 03 мая 2009

descp - это тип указатель на символ (char *). В ошибочной строке вы передаете адрес самого указателя (char **). Удалите «&» перед аргументом.

Да, и не используйте scanf () в производственном коде, особенно для чтения строк. Он не выполняет проверку границ, что делает возможным переполнение буфера.

0 голосов
/ 03 мая 2009

Предоставление нам объявления mkevent () поможет, но это более чем вероятно, потому что вы передаете & descp, когда вы должны передавать descp.

0 голосов
/ 03 мая 2009

Вы не показываете объявление mkevent, но я думаю, вы хотите передать desc, а не его адрес У вас есть:

n=mkevent(day, month, year, starttime, endtime, &descp);

Вы, вероятно, хотите:

n=mkevent(day, month, year, starttime, endtime, descp);
0 голосов
/ 03 мая 2009

сообщение говорит вам, что вашему mkevent нужен параметр (в расположении & descp) другого типа.

Вы должны еще раз проверить, что нужно mkevent (). это не символ **.

возможно, вам следует изменить & descp на descp в строке mkevent - просто догадайтесь.

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