【问题标题】:Array goes of out of bounds without giving any errors数组超出范围而没有给出任何错误
【发布时间】:2021-11-13 06:10:43
【问题描述】:

我的教授让我用 C 语言制作一个 Codebreaker 游戏。(用户通过猜测原始代码来破解代码。原始代码作为 cmd-line arg 给出。每次尝试后;(b,w):正确位置的正确颜色 (b) 和作为代码一部分但不在正确位置的颜色数量 (w) 打印为反馈。)仅允许标准输入和输出。我让它工作了,但是数组 Secret_Code2guess2 超出了范围。它有一些奇怪的行为,比如改变 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


【解决方案1】:

您没有为字符数组中的终止空字符分配空间。每个数组最多需要保存 4 个值,加上一个终止空字符。所以你需要声明它们容纳 4+1 = 5 个字符。否则写入空字符可能会超出数组的末尾。

此外,在您的循环中,您尝试使用printf%s 打印这些数组,然后再对它们进行空终止。在使用%s 打印它们之前,您需要在适当的位置将它们空终止。

【讨论】:

  • 我现在明白了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
相关资源
最近更新 更多