Запутался в указателях и структурах - PullRequest
1 голос
/ 18 марта 2012

Я пытаюсь сравнить строку, хранящуюся в структуре.Я использую scanf для ввода строки, и мне нужно искать строку в структуре.Вот код, который у меня есть:

int printing_airports(int all_routes_size,int all_airports_size){

  int i,position;
  char airport;
  printf("Enter airport code:  ");
  scanf("%s", airport);

  for(i=0;i<all_airports_size;i++){
    if(strcmp(airport,all_airports_divid[i].code) == 0){
      position = i;
    }
  }
  printf("%s",all_airports_divid[position].code);
}

Вот как я объявил свои структуры

struct all_routes{
  int id;
  char departure_code[4];
  char arrival_code[4];
};
struct all_routes all_routes_divid[500];

Это ошибка, которую я получаю, когда пытаюсь скомпилировать

y:~/enee150/project2: compile
functions.c: In function 'printing_airports':
functions.c:370:15: error: invalid type argument of unary '*' (have 'int')
functions.c:373:5: warning: passing argument 1 of 'strcmp' makes pointer from integer without a cast [enabled by default]
/usr/include/iso/string_iso.h:64:12: note: expected 'const char *' but argument is of type 'char'

Что я делаю не так?Пожалуйста, помогите мне.

Ответы [ 4 ]

3 голосов
/ 18 марта 2012

Вы объявляете airport как char

char airport;

но используйте это как строку. Объявите это char airport[100]; или около того.

printf("Enter airport code:  ");
scanf("%s", airport);

scanf требует указатель на переменную, в которой результат должен быть сохранен в качестве аргумента. Когда объявляется как char, airport передается как int в scanf, поэтому в первом сообщении упоминается int. Аргумент разыменовывается (унарный *), чтобы найти место для сохранения результата сканирования.

for(i=0;i<all_airports_size;i++){
  if(strcmp(airport,all_airports_divid[i].code) == 0){

strcmp требует указатель (на строку с нулем в конце) в качестве аргумента. Если передан целочисленный тип, такой как char, без явного приведения, компилятор предупреждает об этом (потому что 99,99% времени это неправильно).

0 голосов
/ 18 марта 2012

чар аэропорта;// Это должен быть char * или char [] для хранения кода printf ("Введите код аэропорта:");scanf ("% s", аэропорт);// scanf ожидает адрес строки, в то время как airport это char

для (i = 0; i

). Кроме того, в объявленной структуре

нет поля с именем кода
0 голосов
/ 18 марта 2012
char airport;

Вы ожидаете только один символ?

Я думаю, что вам нужен символ *, следовательно, последняя строка в ошибке.

Использование char [42] также будет работать.

Или вы могли бы выделить некоторые символы, но это, похоже, не соответствует этому назначению.

0 голосов
/ 18 марта 2012

Вместо передачи char в scanf, вам нужно передать его char *; то есть указатель на место в памяти, где он может записать найденную строку.

Чтобы сделать это, вместо объявления airport как одного char, вам нужно объявить его как массив; скажем, char[20]. Это не подходит для реального приложения, потому что, если длина строки превышает 20 символов, это приведет к уязвимости переполнения буфера, но этого должно быть достаточно для ваших целей.

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