Поиск массива структур для совпадения и вывода - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть массив структур.Мне нужно, чтобы пользователь ввел имя, затем поискал структуру соответствия, затем вывел эту информацию.Я использую strcmp для сравнения строки на совпадение.Таким образом, далеко неважно, что пользователь вводит во весь список, выводится на печать.

Я использую цикл for для циклического перемещения по массиву, чтобы найти подходящее имя.Затем я использовал оператор if с strcmp для сравнения строк на совпадение.Вместо того, чтобы печатать только соответствующую строку, он печатает весь список.

 printf("Enter city name:\n");
 scanf("%s", city);

 //change city to lower case before comparison
 for(i=0; i<strlen(city); i++)
   city[i] = low(city[i]);

 //fp = fopen(outfile, "w");
 printf("The population density is:\n");
 for(i=0;i<10;i++){
   if ( strcmp(city, veg[i].name)) {
     density = veg[i].population / veg[i].area;
     printf("%s  %.2f\n", veg[i].name, density );
   }
 }

Пользователь должен ввести название города, содержащегося в структуре.Цикл должен проходить через структуру, пока не найдет совпадение, и вывести название города с плотностью населения.Тем не менее, оператор if, похоже, ничего не делает.Печатается весь список, а не только совпадение.

Ответы [ 3 ]

1 голос
/ 27 апреля 2019

strcmp возвращает 0, если строки равны, и ненулевое, если они не равны. (Мнемоника: думайте о strcmp как , вычитая строки и возвращая результат вычитания). Следовательно, ваш if блок будет выполняться только тогда, когда veg[i].name делает не равным city.

Вы, вероятно, хотите написать

if (strcmp(city, veg[i].name) == 0) { ... 

Некоторые люди пишут

if (!strcmp(city, veg[i].name)) { ...

но лично мне это менее понятно.

0 голосов
/ 27 апреля 2019

strcmp возвращает целое число. Проверьте описание здесь

https://www.programiz.com/c-programming/library-function/string.h/strcmp

В своем выражении if if вы должны проверить, что значение равно 0, вместо этого сохраняя непосредственно strcmp.

Надеюсь, это сработает.

0 голосов
/ 27 апреля 2019

кажется, что у вас есть функция print в цикле for, поэтому ваша функция print будет вызываться несколько раз (10 в вашем случае) .. когда дело доходит до проверки соответствия, равен ли strcmp (ваши строки) 0.. если они есть, то это совпадение, если нет, то это не совпадение.поэтому проверьте, равен ли strcmp нулю, и выньте функцию печати из цикла for.

...