【问题标题】:Tortoise and the Hare Race with Arrays and Pointers使用数组和指针的龟兔赛跑
【发布时间】:2021-03-17 16:24:48
【问题描述】:

我的任务要求我使用指针在 c 编程中重新创建龟兔赛跑。到目前为止,这是我想出的。我的代码基本上打印了 70 行数组,所有数组都分配给 0,如果数组中的位置是 2 或 3,那就是乌龟或兔子所在的位置,如果有,则意味着它们根据随机决定的动作发生冲突.我的代码有几个问题。

  1. 它按我的预期运行,但最后它会打印出一条错误消息,指出分段错误(核心转储)。
  2. 它没有像我说的那样打印获胜者。
  3. 似乎只有我的野兔在随机移动。它的运动没有任何规律,而我的乌龟似乎并没有随机移动。它沿着一条对角线。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define CLASH 1
#define TORT 2
#define HARE 3

void moveHare(int *hPtr);
void moveTortoise(int *tPtr);
void printCurrentPositions(int *hPtr, int *tPtr);
int main (void)
{
    // variables 
    static int hare = 0;
    static int tortoise = 0;
    static int *hPtr = &hare;
    static int *tPtr = &tortoise;
    int timer = 0;
    
     srand ( time(NULL) );
     puts("ON YOUR MARK, GET SET\nBANG !!!!!\nAND THEY'RE OFF!!!!!\n");
     puts("HT");
    
    //while the race is not finished
    while (tortoise <= 70 || hare <= 70)
    {
        moveHare(&hare);
        moveTortoise(&tortoise);
        printCurrentPositions(&hare, &tortoise);
        timer++;
        printf("\n");
    }
    
    //if functions if one of them wins
    if (hare > tortoise)
    {
        puts("\nHARE WINS!!!");
        printf("It took %d seconds", timer);
            
            
    }
    else if (tortoise > hare)
    {
        puts("\nTORTOISE WINS");
        printf("It took %d seconds", timer);
    }
    
}


//functions for the Hare's movement
void moveHare(int *hPtr)
{
    int randomValue = rand () % 10 + 1;
    
    if (randomValue == 1 || randomValue == 2)
     {
        *hPtr += 0;
     }
     else if (randomValue == 3 || randomValue == 4)
     {
        *hPtr += 9;
     }
     else if (randomValue == 5)
     {
        *hPtr -= 12;
     }
     else if (randomValue>=6 && randomValue <=8)
     {
        *hPtr += 1;
     }
     else if(randomValue>=9)
     {
        *hPtr -= 2;
     }
}

// function for the Tortoise's movement
void moveTortoise( int *tPtr ){
    
     int randomValue  = rand() % 10 + 1;
     
     if (randomValue >= 1 && randomValue <=5)
     {
        *tPtr += 3;
     }
     else if(randomValue == 6 || randomValue == 7)
     {
         *tPtr -= 6;
     }
     else if(randomValue >= 8)
     {
        *tPtr += 1;
     }

    
}

//printing their current positions based on the 
void printCurrentPositions(int *hPtr, int *tPtr)
{
    int Array[70] = {0};
    
    if (*hPtr == *tPtr)
    {
        Array[*hPtr] = CLASH;
    }
    else  
    {
        
        Array[*hPtr] = HARE;
        Array[*tPtr] = TORT;
    }
    
    
    for (size_t i = 0; i < 70; i++)
    {
        if (Array[i] == 0)
        {
            printf(" ");
        }
        else if (Array[i] == TORT)
        {
            printf("T");
        }
        else if (Array[i] == HARE)
        {
            printf("H");
        }
        else if (Array[i] == CLASH)
        {
            printf("OUCH!");
        }
        
    
    }
    
}

【问题讨论】:

  • 好的,我已经修复了指出的两个错误;一个是关于我的一对一错误,另一个是关于我检查值是否在两个数字之间的条件。但我仍然不断看到这个核心转储错误,我无法打印出谁是赢家。 @MikeCat

标签: arrays c pointers error-handling


【解决方案1】:

您的函数printCurrentPositions 包含一个错误。 Array 只有 70 个元素(Array[0]Array[69]),所以你一定不要阅读 Array[70]for 语句的条件应该是i &lt; 70,而不是i &lt;= 70

该函数也不检查*hPtr*tPtr 的值。您必须确保它们是非负数且小于 70 以避免超出范围写入。

最后,moveharemoveTortoise 中使用的一些条件是错误的。条件randomValue&gt;=6 || randomValue &lt;=8randomValue &gt;= 1 || randomValue &lt;=5 将始终为真。他们应该是randomValue&gt;=6 &amp;&amp; randomValue &lt;=8randomValue &gt;= 1 &amp;&amp; randomValue &lt;=5

【讨论】:

  • 您能否详细说明您所说的函数不是检查 *hPtr 和 *tPtr 的值?您具体在谈论@MikeCAT 哪个功能?此外,我修复了我的 for 循环中关于值检查和关闭的错误,但我仍然看到核心转储错误,我仍然无法打印获胜者是谁。
  • @Beakal 函数printCurrentPositions 正在使用Array[*hPtr]Array[*tPtr] 而不检查*hPtr*tPtr 的值。
  • 该函数接收一个包含数字的指针。我要做的就是根据那个数字去一个特定的数组空间。我认为不需要检查。@MikeCAT
  • @Beakal 那么你的想法是错误的。函数moveHaremoveTortoise可能会使这些值超出范围,并且需要进行范围检查以防止超出范围写入数组Array
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2021-02-10
  • 2016-05-12
  • 1970-01-01
相关资源
最近更新 更多