【问题标题】:How do I stop my for loop after it iterates through an array and finds the matching element?在遍历数组并找到匹配元素后,如何停止我的 for 循环?
【发布时间】:2020-03-07 19:46:13
【问题描述】:

我有一个 for 循环,它遍历一个 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 
}



【问题讨论】:

  • if() { ...} 块的末尾添加一个break;。 (你也必须传递(指向)整个数组,而不是单个项目)
  • 在打印信息后添加breakreturn。哪个更好取决于循环后是否有任何代码要执行。如果您返回,很容易在循环后打印“未找到”消息。如果你打破了,你必须知道你是否找到了匹配。请在就 SO 提问之前修正错别字(adresses 应该是 addresses)。请注意,您的函数只有一个地址,但您循环,而不索引数组 - 您需要重新考虑该代码。
  • 发布的代码在通过编译器运行时会产生一些错误和警告消息。编译时,始终启用警告然后修复这些警告。 (对于gcc,至少使用:-Wall -Wextra -Wconversion -pedantic -std=gnu11)注意:其他编译器使用不同的选项来产生相同的结果
  • 请发minimal reproducible example,以便我们重现问题并帮助您调试。
  • 在函数中:printAddress(),以语句:if (adresses.checkNum == num) 开头并包括if 代码块中的所有语句,将adresses(和addresses)替换为addresses[n]

标签: c arrays structure user-input


【解决方案1】:

这是对您的代码的改编,似乎可以按我的预期工作:

#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;
}

您可以在函数中if 的正文中打印后添加return;break;。如果添加return;,则可以在循环之后和函数返回之前添加'printf("Entry %d not found\n", num);`。

请注意,换行符之前通常不需要空格;尾随空格草率。另外,现在名称后面有一个换行符;如果你把名字放到标签Address:中,它看起来很难看。

给定从addr83.c 编译的程序addr83,运行示例如下:

$ addr83
Entry number? 4

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

【讨论】:

  • 我仍然收到错误消息。我相信这是因为我没有正确传递数组。我在这里分享的这个程序不是我的任务,但与它类似。我真的很想分享我的整个程序,但我担心有人会窃取它。
  • 您应该只需要在函数调用中命名数组,如我的示例所示。如果您的“真实”程序有 MCVE,您可以通过电子邮件将其发送给我——请参阅我的个人资料。包含指向此问题的链接,以便我知道它是关于什么的。
猜你喜欢
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 2016-01-26
  • 2017-04-20
  • 1970-01-01
  • 2023-01-13
相关资源
最近更新 更多