【发布时间】:2021-11-13 06:10:43
【问题描述】:
我的教授让我用 C 语言制作一个 Codebreaker 游戏。(用户通过猜测原始代码来破解代码。原始代码作为 cmd-line arg 给出。每次尝试后;(b,w):正确位置的正确颜色 (b) 和作为代码一部分但不在正确位置的颜色数量 (w) 打印为反馈。)仅允许标准输入和输出。我让它工作了,但是数组 Secret_Code2 和 guess2 超出了范围。它有一些奇怪的行为,比如改变 int 变量会导致数组的变化,即使它们是独立的。我知道 C 不检查数组边界,我可以做任何改进吗? 这是我的代码;
#include <stdio.h>
#define Max_Attempts 12
char *Sectret_CODE = NULL;
int main(int argc,char **argv)
{
//Definitions
printf("Available Colors: (B)lue (G)reen (O)range (P)urple (R)ed (Y)ellow\n\n");
//Getting input and validating
if(argc != 2)
{
fprintf(stderr,"Invalid input\n");
return 1;
}
Sectret_CODE = argv[1];
int i = Max_Attempts;
int Won = 0;
while (i > 0 && !Won)
{
int b = 0, w = 0, t=0;
char guess[4];
char Sectret_CODE2[4];
char guess2[4];
printf("No. guesses left: %i\n",i);
printf("Enter Your Guess: ");
scanf("%s",guess);
//printf("%s",guess);
for(int j = 0; j < 4; j++)
{
//printf("%s,%s\n",Sectret_CODE2,guess2);
if(Sectret_CODE[j] == guess[j])
{
b++;
}
else
{
Sectret_CODE2[t] = Sectret_CODE[j];
guess2[t] = guess[j];
t++;
printf("%s,%s,%i\n",Sectret_CODE2,guess2,t);
}
}
int s = t;
//printf("%i",t);
Sectret_CODE2[t] = '\0' ;
guess2[t] = '\0' ;
if(b == 4)
{
printf("You Won\n");
Won = 1;
return 0;
}
else
{
for(int j = 0; j < s; j++)
{
for(int k = 0; k < s;k++)
if(Sectret_CODE2[j] == guess2[k])
{
w++;
break;
}
}
}
printf("Feedback: %i,%i\n",b,w);
i--;
}
if(!Won)
{
printf("You Lose!\n");
}
}
【问题讨论】:
-
"It has some strange behaviours like changing int variables"-- 越界写入数组时这种行为并不奇怪。这种行为是意料之中的。越界写入数组时,任何事情都可能发生。这就是undefined behavior 的本质。 -
索引大于数组大小的数组是未定义的操作。你永远不会知道输出会是什么。例如,在您的情况下,如果您尝试访问 char c = Sectret_CODE[100] 您不会收到任何错误,但 char c 会获得一些随机值(当时该位置内存中包含的任何内容)跨度>
-
"有什么我可以做的改进" 显而易见的事情 - 不允许任何越界访问。确保数组大小足够,并为此进行边界/错误检查。
标签: arrays c segmentation-fault undefined-behavior