c - 运行预先存在的代码,无法在此处输入参数
问题描述
根据下面的代码(在此处获得;'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;
}
解决方案
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;
}
推荐阅读
- scala - spark Scala 数据框选择
- python - 错误是什么意思以及如何解决 - “ValueError:查询数据维度必须匹配训练数据维度”
- javascript - 如何在数组 JavaScript 中仅包含更新的项目
- c# - VS2019、C#、“just-my-code”和不真实的 DLL
- reactjs - axios-mock-adapter onGet 模拟数据无效
- sql - PostgreSQL11 xpath 查询无法正常工作
- git - Git状态忽略更改的行尾
- r - 如何将R中每一行的时间戳转换为日期?
- flutter - 如何在列中正确使用未来的构建器
- vim - 为评论者进行插入重新映射