【问题标题】:Searching through struct array for string entered by user通过结构数组搜索用户输入的字符串
【发布时间】:2018-03-19 16:14:32
【问题描述】:

这只是我程序中的一个函数,它应该搜索用户在结构数组中输入的字符串或整数。我想要做的是添加一条错误消息,并且当在结构数组中找不到输入的字符串或整数时重试的能力。如果您输入正确的字符串或整数,它会搜索得很好,但如果您不输入,则不会发生任何事情。我正在尝试改变它,但找不到解决方案。

我已经在我的 switch 语句中尝试了一段时间,但我需要为所有这三种情况都这样做。但到目前为止,我只尝试过案例 3。

search(struct items aItems[], int *num_items)
{
    int choice_of_search, b=0, found_word=0, search_num, i=0, j=0, k=0;
    char search_phrase[20]; struct items search[MAX];

    printf("Choose what to search for? (1) Item number, (2) Name and (3) Balance. ");
    scanf("%d", &choice_of_search);

    while(choice_of_search < 1 || choice_of_search > 3)
    {
        printf("Wrong choice!\n");
        printf("Choose what to search for? (1) Item number, (2) Name and (3) Balance. ");
        scanf("%d", &choice_of_search);
    }


    switch(choice_of_search)
    {
        case 1:
            printf("Item number?\n");
            scanf("%d", &search_num);
            for(i = 0; i < *num_items; i++)
            {
                if(search_num == aItems[i].itemnumber)
                {
                    printf("Item number found!\n");
                    search[found_word]=aItems[i];
                    found_word+=1;
                }
            }
            break;

        case 2:
            printf("Name?\n");
            scanf("%s", search_phrase);
            for(i = 0; i < *num_items; i++)
            {
                if(strstr(aItems[i].name, search_phrase))
                {
                    printf("Name found!\n");
                    search[found_word]=aItems[i];
                    found_word+=1;
                }
            }
            break;

        case 3:
            printf("Balance?\n");
            scanf("%d", &search_num);
            for(i = 0; i < *num_items; i++)
            {
                if(search_num == aItems[i].balance)
                {
                    printf("Balance found!\n");
                    search[found_word]=aItems[i];
                    found_word+=1;
                }
                else
                {
                    printf("Balance not found! Try again.\n");
                    printf("Balance?\n");
                    scanf("%d", &search_num);
                }
            }
            break;
    }


    while(b < found_word)
    {
        printf("Item number: %d Name: %s  Balance: %d\n", search[b].itemnumber, search[b].name, search[b].balance);
        b++;
    }
}

【问题讨论】:

  • search 缺少返回类型。
  • @melpomene 感谢您的提醒。我遇到的问题是我的案例,你知道我应该怎么做吗?提示或提示或其他任何东西。
  • 为了便于阅读和理解:1) 遵循公理:每行只有一个语句,并且(最多)每个语句一个变量声明。 2) 单独的代码块 ( for, if, else, while, do...while, switch, case, default) 通过一个空行。
  • 为了让我们正确调试您发布的代码,我们必须“发明”数据定义和main() 函数。这不是我们在这里要做的。请发布“简短”的代码可以干净地编译,但仍然会出现问题。

标签: c arrays search struct


【解决方案1】:

也许这会有所帮助

int done;
...
...

    case 3:
        done = 0;
        while(1);
        {
            printf("Balance?\n");
            scanf("%d", &search_num);
            for(i = 0; i < *num_items; i++)
            {
                if(search_num == aItems[i].balance)
                {
                    printf("Balance found!\n");
                    search[found_word]=aItems[i];
                    found_word+=1;
                    done = 1;
                }
            }
            if (done) break;

            printf("Balance not found! Try again.\n");
        } 
        break;

但请注意,该代码对用户不友好,因为它不允许用户在没有匹配的情况下停止搜索。所以也许你应该考虑添加一个“你想再试一次”选项。

一个简单的方法可以是

            printf("Balance not found! Would like to try again?.\n");
            scanf(" %c", &some_char);
            if (some_char != 'y') break;

【讨论】:

  • 对不起,我对编程还是很陌生。我不确定我是否理解您添加的 while 循环和 if 语句。你介意解释一下吗?
  • @Camel while(1){...} 的意思是“永远循环”。停止循环的唯一方法是在其中包含 break 语句。因此if (done) break
  • 嘿伙计,非常感谢。我已经尝试了很长时间才能做到这一点。并感谢有关用户友好事物的附加提示。我打算在我能把这件事做好后尽快添加它。
  • 顺便说一下 if(done) break;例如,我习惯于使用 if(variable == 1) 等条件的 if 语句。但是在您的 if 语句中,条件只是变量本身。和 if(done ==1) break; 一样吗? ?
  • 有没有办法让 scanf 代码使用起来更安全?因为如果我输入多个字符或数字。程序类型的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 2015-12-09
  • 1970-01-01
相关资源
最近更新 更多