У меня есть куча практических вопросов по структурам, все из которых включают структуры, переданные в качестве указателей на аргументы функций. Теперь у меня есть конкретный вопрос, который просит меня сохранить некоторые имена и номера телефонов в структуре телефонной книги. Оно гласит:
Напишите программу на C, которая реализует следующие две функции. Функция readin()
читает число
имена людей и соответствующие им номера телефонов, передает данные вызывающей стороне
через параметр p
и возвращает количество введенных имен. Используется символ #
чтобы указать конец ввода пользователя. Функция search()
находит телефонный номер имени входа
цель, а затем печатает имя и номер телефона на экране. Если имя не может быть
найден, тогда он напечатает соответствующее сообщение об ошибке. Прототипы двух функций приведены ниже:
int readin(PhoneBk *p);
void search(PhoneBk *p, int size, char *target);
Определение структуры для PhoneBk
приведено ниже:
typedef struct {
char name[20];
char telno[20];
} PhoneBk;
Шаблон программы выглядит следующим образом:
#include <stdio.h>
#include <string.h>
#define MAX 100
typedef struct {
char name[20];
char telno[20];
} PhoneBk;
int readin(PhoneBk *p);
void search(PhoneBk *p, int size, char *target);
int main() {
PhoneBk s[MAX];
char t[20];
int size;
size = readin(s);
printf("Enter search name: \n");
gets(t);
search(s, size, t);
return 0;
}
int readin(PhoneBk *p) {
/* Write your program code here */
}
void search(PhoneBk *p, int size, char *target) {
/* Write your program code here */
}
Мне придется сравнивать строки дважды в моей программе: во-первых, чтобы проверить, введено ли #
в качестве имени (в этом случае я бы хотел, чтобы программа перешла прямо к функции поиска, не спрашивая номер телефона). ); и два, если целевое имя совпадает с именем одной из структур телефонной книги.
Теперь мне совершенно чуждо понятие структур, которые объявляются как массивы, но передаются как указатели, поэтому я думаю, способ получить пользовательский ввод для следующей записи - это приращение переменной-указателя (здесь p
). Для функции «получить записи до - # - введен» я написал (используя strcmp
):
int readin(PhoneBk *p) {
strcpy(p->name, "Test"); //To guarantee a character that is not #.
while (strcmp(p->name, "#") != 0) {
printf("Enter person name, # to stop.\n");
scanf("%s", p->name);
printf("Enter the telephone number.\n");
scanf("%s", p->telno);
p++;
}
return p;
}
Я хочу набрать p->name
в виде строки, чтобы strcmp()
мог работать с ней. Но предупреждение неоднократно отображается:
warning: cast from pointer to integer of different size
warning: passing argument 1 of strcmp() makes pointer from integer without a cast
Эта ошибка много раз обсуждалась на форумах (я искал), но ничто из того, что я видел, не поможет с такой комбинацией структур и strcmp()
.
Я полностью отказался от strcmp()
для второй функции, которая отображает запись человека, если целевое имя найдено, и поэтому я использовала цикл для непосредственного сравнения строк.
void search(PhoneBk *p, int size, char *target) {
int i, flag = 1, strCompare;
char c1 = *(p->name), c2 = *target, p1 = p->name, p2 = target;
while (c1 != '\0' && c2 != '\0') { //Comparing strings.
strCompare = (int)(c1 - c2);
if (strCompare != 0)
break;
else {
p1++;
p2++;
}
}
for (i = 0; i < size; i++, p++) {
if (strCompare == 0) {
flag = 0;
printf("Name = %s, Tel. = %s\n", p->name, p->telno);
}
if (flag == 1)
printf("Name not found.\n");
}
}
Но снова я получаю ряд предупреждений.
warning: cast from pointer to integer of different size
warning: initialization makes pointer from integer without a cast
Я действительно думаю, что моя жизнь была бы проще, если бы все структуры передавались как массивы, и в этом случае я мог бы просто перебирать массив структур с помощью цикла For и покончить с этим. Это то, что я всегда делал в старшей школе, но теперь, когда я учусь в университете, я вынужден иметь дело со структурами, которые передаются как указатели.
Как мне обработать strcmp()
в этом случае? Как это можно применить к любой программе со структурами, переданными как указатели?