struct Store {
    int number;
    char name[50];
    double caloNumber;
};

int main(int argc, const char * argv[]) {
    int totalCalo = 0;
    int keyNumber;

    struct Store store1 = {1,"A",390},
    store2 = {2, "B",710},
    store3 = {3, "C",569},
    store4 = {4, "D",450},
    store5 = {5, "E",630},
    store6 = {6, "F",370},
    store7 = {7, "G",720},
    store8 = {8, "H",680},
    store9 = {9, "I",570},
    store10 = {10, "J",530},
    store11 = {11, "K",570},
    store12 = {12, "L",380},
    store13 = {13, "M",670},
    store14 = {14, "N",590},
    store15 = {15, "O",430};


    printf("Enter the number");

    printf("/Breakfast : \n");
    scanf("%d",keyNumber);

    printf("/Lunch : \n");

    printf("/Dinner : \n");


    //caculate 3 calories

    return 0;
}


使用用户输入的号码提取特定数据时遇到了一些麻烦。
例如:A〜O是商店的名称,应用程序将询问用户选择了哪个商店,用户将输入商店的“ keyNumber”,第三个数字是卡路里数据。
我的问题是如何从keyNumber中获取卡路里数据。没有C语言的地图和字典,所以我只是不知道该怎么做。

最佳答案

如果您确实不想强迫用户查找食物的数量并且仍然具有查找gperf,则可以使用O(1)https://www.gnu.org/software/gperf/)静态生成一个完美的哈希。像这样

%ignore-case
%readonly-tables
%struct-type
struct month { const char *name; int calories; };
%%
A, 390
B, 710
C, 569
D, 450
E, 630
F, 370
G, 720
H, 680
I, 570
J, 530
K, 570
L, 380
M, 670
N, 590
O, 430
%%

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

const struct month *month(const char *str) {
    return in_word_set(str, strlen(str));
}

int main(void) {
    const struct month *a = month("A"), *a_lc = month("a"), *z = month("z"),
        *j = month("j");
    printf("A: %d.\n"
        "a: %d.\n"
        "z: %d.\n"
        "j: %d.\n", a ? a->calories : -1, a_lc ? a_lc->calories : -1,
            z ? z->calories : -1, j ? j->calories : -1);
    return EXIT_SUCCESS;
}


然后,gperf Calories.gperf > Calories.c。从gperf 3.0.4开始,C编译器抱怨未使用len参数,但这可能是因为示例中所有示例的len == 1。它还抱怨缺少初始化器,但这是固定的。

A: 390.
a: 390.
z: -1.
j: 530.

关于c - 使用keyNumber提取数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54134909/

10-09 09:00