【问题标题】:Need Help for C ProgramC程序需要帮助
【发布时间】:2015-10-28 03:46:35
【问题描述】:

对于一个作业,我正在编写代码来计算计算 2 个掷骰子的总和的次数...例如,如果 die 1 是 5,die 2 是 6,那么 timesRolled[(die 1 + die 2)] 将递增。代码如下,它演示了我的逻辑。返回的值是垃圾,我需要帮助确定我在哪里出错了。提前致谢!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

int main() {
    int i = 0;         // Loop counter iterates numRolls times
    int numRolls = 0;  // User defined number of rolls
    int timesRolled[] = { 0 };
    int pointerVal = 0;
    int rollNumber = 0;
    int die1 = 0;      // Dice values
    int die2 = 0;      // Dice values
    int rollTotal = 0; // Sum of dice values

    printf("Enter number of rolls: ");
    scanf_s("%d", &numRolls);
    srand(time(0));

    if (numRolls >= 1) {
        // Roll dice numRoll times
        for (i = 0; i < numRolls; ++i) {
            die1 = rand() % 6 + 1;
            die2 = rand() % 6 + 1;
            rollTotal = die1 + die2;
            ++timesRolled[(rollTotal)];
            printf("\nRoll %d is %d (%d+%d)",(i + 1), rollTotal, die1, die2);
        }
        printf("\n\nDice roll statistics: \n");
        for (pointerVal = 1; pointerVal <= 12; ++pointerVal) {
            printf("%ds: %d\n", pointerVal, timesRolled[(pointerVal)]);
        }   
    }
    else {
        printf("Invalid rolls. Try again.\n");
    }

    _getch();
    return 0;
}

【问题讨论】:

    标签: c arrays loops pointers


    【解决方案1】:

    您正在访问的数组元素未定义为数组大小为1pointerVal&lt;=12

    for (pointerVal = 1; pointerVal <= 12; ++pointerVal) {
                printf("%ds: %d\n", pointerVal, timesRolled[(pointerVal)]);
    

    替换:

    int timesRolled[] = { 0 }int timesRolled[13] = { 0 }

    骰子的总和最多为 12。

    【讨论】:

      【解决方案2】:

      你声明:

      int timesRolled[] = { 0 };
      

      这将创建一个长度为1 的数组timesRolled。但是在 for 循环中,您正在递增

      ++timesRolled[(rollTotal)];
      

      如果rollTotal 大于0,这会导致缓冲区溢出。因为那时您正在尝试访问未定义的数组元素。这将引导您访问Undefined Behavior

      printf() 也会发生同样的情况:

      printf("%ds: %d\n", pointerVal, timesRolled[(pointerVal)]);
      

      所以首先确定timesRolled最大长度。然后声明并初始化它。例如:

      int timesRolled[13] = { 0 }; //timesRolled is now an array of length 13
      

      【讨论】:

        猜你喜欢
        • 2014-08-27
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 2021-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多