2014-12-01 2 views
1

Эта ошибка продолжает появляться, и я не знаю, как ее решить.
Пожалуйста, помогите! ошибка всплывает в этой строке:
---fscanf(ifp, "%s", archive.team[i].color);---ожидается const char *, но аргумент имеет тип char

Существует также
"passing argument 2 of strcmp makes pointer from integer without a cast"
ошибка в строке:
---if (strcmp(archive.team[j].name, name) == 0){---

Вот сокращенный вариант моего кода --------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------

#include <stdio.h> 

struct dragon { 
    char name[40] ; 
    char color[40] ; 
}; 
struct collection { 
    struct dragon team[1000]; 
    int num_dragons; 
}; 

int main() { 

struct collection archive; 

FILE * ifp = fopen("dragon.txt", "r"); 
int i, j, k, l, m, updates, n=0; 
char directions, color, name, ADD, REMOVE, SEARCH, LIST, rem; 

fscanf(ifp, "%d", &updates); 
for (i=0; i<updates; i++){ 
    fscanf(ifp, "%s", directions); 

    if (directions==ADD){ 
     fscanf(ifp, "%s", archive.team[i].name); 
     fscanf(ifp, "%s", archive.team[i].color); 
     printf("%s the %s has been added to the team.", archive.team[i].name, archive.team[i].color); 
    } 

    else if (directions==REMOVE){ 
     fscanf(ifp, "%s", name); 
     for (j=0; j<updates; j++){ 
      if (strcmp(archive.team[j].name, name) == 0){ 
       strcpy(archive.team[j].name, "rem"); 
       strcpy(archive.team[j].color, "rem"); 
       printf("%s the %s has been removed from the team.", name, archive.team[j].color); 
      } 
     } 
    } 

    else if (directions==SEARCH){ 
     fscanf(ifp, "%s", name); 
     for (k=0; k<updates; k++){ 
      if (strcmp(archive.team[k].name, name) == 0) 
      printf("%s the dragon is currently on the team.", name); 
     } 
     for (l=0; l<updates; l++){ 
      if (strcmp(archive.team[l].name, name) == 0) 
       n++; 
     } 
     if (n==0) 
      printf("%s the dragon is NOT currently on the team.", name); 

    } 

    else if (directions==LIST){ 
     fscanf(ifp, "%s", color); 
     printf("%s dragons:\n", color); 
     for (m=0; m<updates; m++){ 
      if (strcmp(archive.team[m].color, color) == 0) 
      printf("%s\n", archive.team[m].name); 
     } 
    } 
} 
+1

декларацию 'archive'? –

+0

Пожалуйста, напишите полный проверяемый код http://stackoverflow.com/help/mcve –

+0

«Конденсированная версия» вашего кода не годится, если вы не разделяете важные части и оставляете глупости, как «введите код здесь». –

ответ

2

Ваше заявление:

char directions, color, name, ADD, REMOVE, SEARCH, LIST, rem; 

совершенно неправильно. Вы пытаетесь написать строку для одного символа. Даже если вам удастся скомпилировать это, выполнение такого кода приведет к переполнению буфера и неожиданному поведению (AV скорее всего).

Сравнение

if (directions==ADD) 

также весьма подозреваемое, сравнить некоторые данные с неинициализированным полукоксом, которые не будут работать по очевидным причинам. Использование массивов с фиксированной длиной также не очень хорошая идея, потому что любая строка, превышающая 39 символов, вызовет переполнение буфера.

Честно говоря, рекомендуется переписать код с помощью std :: string для хранения строк и std :: cin/cout для ввода/вывода.

Давайте проанализируем ваш код с самого начала: вы определяете направление изменения, которое должно описывать, какое действие должно выполняться над вашими данными. Эта переменная является символом char, но вы пытаетесь написать какое-то жало в нее, поэтому вы, скорее всего, получите AV здесь. Затем вы пытаетесь сравнить свои данные с некоторой переменной ADD, которая никогда не была инициализирована, поэтому содержит случайный символ из стека.

Чтобы сделать текущее решение работоспособным: 1.Измените объявление направления на char[40]; 2. Изменить ADD на char* ADD = "ADD"; (УДАЛЕНИЕ, ПОИСК и т. Д. Следует изменить одинаково); 3. Изменить код сравнение if(!strcmp(directions, ADD))

+0

А, прошу прощения. Я начинающий программист, и это одно из моих заданий, на которые я застрял. Как бы я переписал свои объявления char, чтобы он компилировался, и как бы я инициализировал неинициализированный символ? – DavidT

+0

Честно говоря, проблема гораздо глубже, чем объявление char. Давайте проанализируем ваш код с самого начала: – Ari0nhh

1

Я думаю, что эти строки, которые дают ошибку

fscanf(ifp, "%s", name); 
fscanf(ifp, "%s", directions); 

и не

fscanf(ifp, "%s", archive.team[i].color); 

потому

name is of type `char` and not `char []`. 

Опять же, здесь

strcmp(archive.team[j].name, name) 

2-й пары должны быть типа char [], но он имеет тип char.

Проблема здесь

char directions, color, name, ADD, REMOVE, SEARCH, LIST, rem; 

color и name вероятно, должны быть массивами, например, для.

char directions, color[40], name[40], ADD, REMOVE, SEARCH, LIST, rem; 
+0

Я думал, что это возможно. Любые предложения о том, как исправить это синтаксически? – DavidT

+0

@DavidT - добавлено правильное объявление для 'color' и' name'. – user93353

+0

Я пробовал это. Он избавился от ошибок, но он сработает, когда он компилируется на экран. Я предполагаю, что это может быть из других ошибок? – DavidT

0

Я думаю, что вы забыли закрыть the main function properly слишком

+0

это может быть полезная ссылка, но это комментарий. – Gahan

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