2016-05-18 4 views
4

Я работаю над упражнением в течение последних нескольких дней, и я имея это предупреждение (как следует из названия). Я пробовал кучу вещей, но я действительно не знаю, как точно это исправить. Я не умею программировать, поэтому есть ошибки. Ниже приведены Структуры, я использую (которые не могут быть изменены, потому что это, как они даны):Ошибка C: формат '% s' ожидает аргумент типа 'char *', но аргумент 2 имеет тип 'char (*) [100]'

typedef struct bookR* book; 
struct bookR{ 
    char author[MAXSTRING]; 
    enum genres{fiction,scientific,politics}; 
    int id; 
    char review[MAXLINES][MAXSTRING]; 

}; 

typedef struct nodeR* node; 
struct nodeR{ 
    book b; 
    node next; 

}; 

typedef struct listR* list; 
struct listR{ 
    node head, tail; 
    int size; 
}; 

А вот часть кода, где происходит проблема:

void addBook(book b, list bList){ 
char author [MAXSTRING]; 
int id; 
char review [MAXSTRING][MAXLINES]; 
printf ("Give the author,`enter code here` id and review of the new book respectively"); 
scanf("%s",author); 
scanf("%d",&id); 
scanf("%s",review); 
node k=(node)malloc(sizeof(struct nodeR)); 
assert(k); 
k->next=NULL; 
strcpy(k->b->author,author); 
k->b->id=id; 
strcpy(k->b->review,review[MAXSTRING]);} 

И это предупреждение, которое я получаю:

warning: format '%s' expects argument of type 'char *' but argument 2 has type 'char (*)[100]' [-Wformat=] 
scanf("%s",review); 
warining:passing argument 1 of 'strcpy' from incompatible pointer tupe [-Wincompatible-pointer-types] 
strcpy(k->b->review,review[MAXSTRING]); 

Любая помощь очень ценится. Спасибо за ваше время и извините за длинный пост.

+0

'зсап ("% s", обзор)' -> 'зсап ("% s", обзор [индекс])' – LPs

+3

Я думаю, что решение кроется в самом предупреждении. – SKD

+0

'strcpy (k-> b-> review, review [MAXSTRING]);' -> 'strcpy (k-> b-> review [index, review [MAXSTRING-1]);' – LPs

ответ

1
  • Предупреждение No1

    Для того, чтобы использовать scanf, вам нужно передать указатель к нему. Вы заявили:

    char review [MAXSTRING][MAXLINES]; 
    

    но вы читаете:

    scanf("%s",review); 
    

    Вы должны изменить это:

    scanf("%s", review[i]); 
    

    где i является индексом от 0 к MAXSTRING-1.

  • Предупреждение No2

    Кроме того, утверждение:

    strcpy(k->b->review,review[MAXSTRING]); 
    

    выходит за пределы, как вы позиция вашего массива достигает review[MAXSTRING-1]. Кроме того, вы назначаете строку целым массиву. Таким образом, вы должны изменить его на:

    strcpy(k->b->review[index], review[MAXSTRING-1]); 
    

еще два замечания:

  1. Смотрите эту link on why not to cast the result of malloc.
  2. Имейте в виду, что в декларации, такие как:

    array[x][y]; 
    

    x указывает на линии и y указывает столбцы. У вас есть они в обратном порядке, поэтому убедитесь, что вы не запутались и что вы действительно обращаетесь к строкам, когда вам нужны строки и столбцы, когда вам нужны столбцы.

+0

Большое спасибо за помощь. Я не понимаю, почему он выходит из-под контроля.Я изменил его на 'strcpy (k-> b-> review, review [MAXSTRING-1]);' но я получаю ту же ошибку – Karamanis

+0

@Karamanis см. Мой отредактированный пост и скажите, поможет ли он :) – Marievi

+0

Вау, ваш отредактированный пост намного лучше. Я знаю о массивах, но я не заметил, что я переключил линии со столбцами. О кастинге malloc: в классе мы сказали, чтобы мы дали результат. Вы предполагаете, что это 'node k = malloc (sizeof (struct nodeR));'. Могу ли я использовать malloc? – Karamanis

2

первое предупреждение

char review [MAXSTRING][MAXLINES]; 

это матрица, которая может рассматриваться как массив C-строки в вашем случае.

Каждая C-Строка review[index] где индекс идет от 0 к MAXSTRING-1

Так

scanf("%s",review) 

является неправильным из-за вы должны пройти один C-String функционировать, то вы должны написать:

scanf("%s",review[index]); 

Я предлагаю вам ограничить входную строку максимально допустимыми символами для каждой строки MAXLINES-1 использованием вместо scanf:

fgets(review[index], MAXLINES, stdin); 

второе предупреждение

То же самое для review члена struct bookR. Так

strcpy(k->b->review,review[MAXSTRING]); 

должен быть

strcpy(k->b->review[index],review[MAXSTRING-1]); 

Как вы можете видеть, что есть вторая проблема в вашем STRCPY вызова: второй параметр адрес вашего массива строк из границы, что вызвать Undefined Behavior.

Другие предупреждения

Существует предупреждение больше в вашем коде:

test.c:666:45: warning: declaration does not declare anything 
    enum genres{fiction,scientific,politics}; 
              ^

Заключительные соображения

Я думаю, вы хотите, чтобы переключить Определяет в определениях матрицы, как вы сделано в struct bookR, например:

char review [MAXLINES][MAXSTRING]; 

Думаю, может быть лучшим выбором, чтобы задать для каждого отдельного данных конкретный prinf и его scanf/fgets.

printf ("Give the author: "); 
fgets(author, MAXSTRING, stdin); 
printf ("Enter id: "); 
scanf("%d",&id); 
printf ("Enter review of the new book respectively: "); 
fgets(review[index], MAXSTRING, stdin); 
+0

Первое предупреждение, которое я получаю. Но у второй проблемы есть проблема: я изменил ее на 'strcpy (k-> b-> review [index, review [MAXSTRING-1]);'. Но я получаю ту же ошибку. Это из-за того, что «как вы видите, есть вторая проблема в вашем вызове strcpy: второй параметр адресует ваш массив строк без привязки, которые вызывают Undefined Behavior», которые вы сказали. 'Test.c: 666: 45: warning : декларация ничего не объявляет enum genres {fiction, science, policy}; 'Ой, я забыл об этом, я знаю, как это исправить. – Karamanis

+0

@Karamanis Как вы объявили и запустили 'index'? См. Мое редактирование – LPs

+0

@LPs, потому что у вас была опечатка в вашем ответе перед вашим редактированием :) – Marievi

Смежные вопросы