Как мне остановить мой для l oop после того, как он перебирает массив и находит соответствующий элемент? - PullRequest
0 голосов
/ 07 марта 2020

У меня есть для l oop, который перебирает массив типа struct, но когда я передаю пользовательский ввод в функцию, которая извлекает значение, он выводится 10 раз. Мне нужно, чтобы функция main () спрашивала пользователя, какой номер адресной книги печатать, чтобы затем он передавался в функцию, которая его печатает, но функция проверяет, есть ли такое число в массиве, и если он есть, то печатает из значений этого введенного #. Вот код, который продолжает печатать printAddress () десять раз:

STRUCTURE FOR 
struct addressBook
{ 
int entryNum;
char name[100];
char address[100];
}; 

void printAddress(struct addressBook addresses, int num)
{ 
    int n = 0;
    for(n=0; n < 10; n++)
    {
        if (addresses.checkNum == num)
        { 
            printf("\nBELOW IS ADDRESS # %i DETAILS: \n", num);
            printf("Address Book Number: %i \n", addresses.entryNum);
            printf("Name: %s", addresses.name);
            printf("Address: %s \n", addresses.address);

    }
    }

}


my main function: 

int main()
{ 
// create a addressBook array of at least 10 
struct addressBook addresses[10];

//if statements where user can select to 
//add a name to address book, display a single name or quit the program

//this is if they choose to display a single name using a number 
else if (choice == 2)
    {
    int num; 
    int i = 0;
    printf("Enter book number: ");
    scanf("%i", &num);
    printAddress(addresses[i], num);
    } 

return 0 
}



1 Ответ

0 голосов
/ 08 марта 2020

Вот адаптация вашего кода, которая, кажется, работает так, как я ожидал:

#include <stdio.h>

struct addressBook
{
    int entryNum;
    char name[100];
    char address[100];
};

static
void printAddress(int n_addr, struct addressBook addresses[n_addr], int num)
{
    for (int n = 0; n < n_addr; n++)
    {
        if (addresses[n].entryNum == num)
        {
            printf("\nBELOW IS ADDRESS # %i DETAILS:\n", num);
            printf("Address Book Number: %i\n", addresses[n].entryNum);
            printf("Name: %s\n", addresses[n].name);
            printf("Address: %s\n", addresses[n].address);
        }
    }
}

int main(void)
{
    struct addressBook addresses[10] =
    {
        { 1, "John Doe", "1234 Any St, Some Town, CA 94301" },
        { 2, "Mary Fog", "1270 Some St, Any Town, CA 94303" },
        { 3, "Anne Pit", "1240 Any Rd, Some City, CA 94301" },
        { 4, "Bill Zoo", "1252 Some St, Any Town, CA 94303" },
        { 5, "Phil Tin", "1258 Any Rd, Some City, CA 94301" },
    };

    int num;
    printf("Entry number? ");
    scanf("%i", &num);
    printAddress(5, addresses, num);

    return 0;
}

Вы можете добавить return; или break; после печати в теле if в функции. Если вы добавите return;, вы можете добавить 'printf ("Entry% d not found \ n", num); `после l oop и до возврата функции.

Обратите внимание, что вы не обычно не нужны пробелы перед символами новой строки; концевые заготовки неаккуратные. Кроме того, теперь есть новая строка после имени; это выглядит ужасно, если вы запустите имя в теге Address:.

Учитывая, что программа addr83 скомпилирована из addr83.c, пример запуска:

$ addr83
Entry number? 4

BELOW IS ADDRESS # 4 DETAILS:
Address Book Number: 4
Name: Bill Zoo
Address: 1252 Some St, Any Town, CA 94303
$
...