2009-05-03 2 views
0

может кто-то быстро взглянуть на этот код на C и посмотреть, почему я получаю ошибку компилятора? Это функция для ввода деталей в структуру календаря и должна создать один узел, т. Е. Одно «событие» в календаре.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», или я попытался создать узел в структуре неправильно?

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

+0

Пожалуйста, внесите реальный код путем копирования и вставки - не пытайтесь повторить его. Также укажите комментарий в коде, где происходит сообщение об ошибке – 2009-05-03 12:41:57

ответ

2

Указатель должен указывать на буфер, достаточно большой для значения, которое вводит пользователь в вызове 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*) в качестве описания, а не указатель на указатель на строку (перейти в descp а не &descp).

0

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

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

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

1

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

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

0

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

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

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

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

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