数组越界而没有给出任何错误
Array goes of out of bounds without giving any errors
我的教授让我用 C 语言制作一个 Codebreaker 游戏。(用户通过猜测原始代码来破解代码。原始代码作为 cmd 行给出 arg.After 每次尝试;(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] = '[=10=]' ;
guess2[t] = '[=10=]' ;
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");
}
}
您没有为字符数组中的终止空字符分配 space。每个数组最多需要保存 4 个值,加上 一个终止空字符。所以你需要声明它们包含 4+1 = 5 个字符。否则写空字符可以写到数组的末尾。
此外,在您的循环中,您试图在以空值终止它们之前使用 printf
和 %s
打印这些数组。在使用 %s
.
打印它们之前,您需要在适当的时候以 null 终止它们
我的教授让我用 C 语言制作一个 Codebreaker 游戏。(用户通过猜测原始代码来破解代码。原始代码作为 cmd 行给出 arg.After 每次尝试;(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] = '[=10=]' ;
guess2[t] = '[=10=]' ;
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");
}
}
您没有为字符数组中的终止空字符分配 space。每个数组最多需要保存 4 个值,加上 一个终止空字符。所以你需要声明它们包含 4+1 = 5 个字符。否则写空字符可以写到数组的末尾。
此外,在您的循环中,您试图在以空值终止它们之前使用 printf
和 %s
打印这些数组。在使用 %s
.