首页 > 解决方案 > 运行预先存在的代码,无法在此处输入参数

问题描述

根据下面的代码(在此处获得;'gifts.c​​'),当使用神秘礼物红外通信时,一个五位数的 ID 号(在 00000 和 65535 之间变化)将产生 Pokémon Gold、Silver 和 Crystal 物品的子集。我想知道哪些项目与我自己的 ID 号相关联,但我只是无法弄清楚 ID 应该在代码中的位置。我尝试将几乎所有参数都替换为随机的 12345 ID,但我不断收到错误消息。

const char* items[] = {
    "BERRY",
    "PRZCUREBERRY",
    "MINT BERRY",
    "ICE BERRY",
    "BURNT BERRY",
    "PSNCUREBERRY",
    "GUARD SPEC",
    "X DEFENSE",
    "X ATTACK",
    "BITTER BERRY",
    "DIRE HIT",
    "X SPECIAL",
    "X ACCURACY",
    "EON MAIL",
    "MORPH MAIL",
    "MUSIC MAIL",
    "MIRACLEBERRY",
    "GOLD BERRY",
    "REVIVE",
    "GREAT BALL",
    "SUPER REPEL",
    "MAX REPEL",
    "ELIXIR",
    "ETHER",
    "WATER STONE",
    "FIRE STONE",
    "LEAF STONE",
    "THUNDERSTONE",
    "MAX ETHER",
    "MAX ELIXIR",
    "MAX REVIVE",
    "SCOPE LENS",
    "HP UP",
    "PP UP",
    "RARE CANDY",
    "BLUESKY MAIL",
    "MIRAGE MAIL"
};

const char* decorations[] = {
    "JIGGLYPUFF DOLL",
    "POLIWAG DOLL",
    "DIGLETT DOLL",
    "STARYU DOLL",
    "MAGIKARP DOLL",
    "ODDISH DOLL",
    "GENGAR DOLL",
    "SHELLDER DOLL",
    "GRIMER DOLL",
    "VOLTORB DOLL",
    "CLEFAIRY POSTER",
    "JIGGLYPUFF POSTER",
    "SUPER NES",
    "WEEDLE DOLL",
    "GEODUDE DOLL",
    "MACHOP DOLL",
    "MAGNAPLANT",
    "TROPICPLANT",
    "NES",
    "NINTENDO 64",
    "BULBASAUR DOLL",
    "SQUIRTLE DOLL",
    "PINK BED",
    "POLKADOT BED",
    "RED CARPET",
    "BLUE CARPET",
    "YELLOW CARPET",
    "GREEN CARPET",
    "JUMBOPLANT",
    "VIRTUAL BOY",
    "BIG ONIX DOLL",
    "PIKACHU POSTER",
    "BIG LAPRAS DOLL",
    "SURF PIKACHU DOLL",
    "PIKACHU BED",
    "UNOWN DOLL",
    "TENTACOOL DOLL",
};

int is_valid_item(unsigned int ID, unsigned char item) {
    if (ID > 0xFFFF) {
        return 0;
    }
    if (item >= 0x18 && item < 0x20) {
        return (item & 0x07) == ((ID>>12) & 0x07);
    } else if (item < 0x22) {
        int pos = (((item>>1)+7)&0x07) | ((item>>1)&0x08) | ((item>>2)&0x08);
        return (item & 0x01) == ((ID>>pos) & 0x01);
    } else {
        return 0;
    }
}

int is_valid_deco(unsigned int ID, unsigned char deco) {
    if (ID > 0xFFFF) {
        return 0;
    }
    return is_valid_item(((ID&0xFF)<<8)|(ID>>8), deco);
}

const char* frequency(unsigned int gift) {
    if (gift < 0x10) return "often";
    if (gift < 0x18) return "sometimes";
    if (gift < 0x22) return "rare";
    return "never";
}

int main() {
    unsigned int ID;
    while (1) {
        printf("Please enter trainer ID [00000-65535]: ");
        if (scanf("%u",&ID)<1) {
            scanf("%*s");
            printf("invalid ID\n");
            continue;
        }
        if (ID > 0xFFFF) {
            printf("invalid ID\n");
            continue;
        }
        break;
    }
    for (int i=0; i<0x22; i++) {
        printf("%17s: %s\n",items[i],is_valid_item(ID, i)?frequency(i):"no");
    }
    printf("\n");
    for (int i=0; i<0x22; i++) {
        printf("%17s: %s\n",decorations[i],is_valid_deco(ID, i)?frequency(i):"no");
    }
    return 0;
}

标签: c

解决方案


ID 应该在代码中的位置

它看起来像:

if (scanf("%u",&ID)<1) {

您可以删除整个程序if并将其替换为ID=0xsomething;或仅运行程序并在程序的输入中键入 ID。

您可以这样做,只需进行最少的更改:

while (1) {
    printf("Please enter trainer ID [00000-65535]: ");

    ID = 0xabcd;   // in hexadecimal for example
    ID = 12345;

    if (ID > 0xFFFF) {
        printf("invalid ID\n");
        continue;
    }
    break;
}

推荐阅读