C 尝试运行老虎机程序时随机出现错误代码

C 尝试运行老虎机程序时随机出现错误代码,c,C,我正在为一台基本的老虎机编写一个程序,随机生成数字,并从数组中显示相应的“符号”。程序大部分时间都在执行,但我随机得到一个错误代码-1073741819(0xC0000005)。我对C非常陌生,所以我对很多事情都不熟悉,包括我的代码中到底是什么导致了这个错误 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); ch

我正在为一台基本的老虎机编写一个程序,随机生成数字,并从数组中显示相应的“符号”。程序大部分时间都在执行,但我随机得到一个错误代码-1073741819(0xC0000005)。我对C非常陌生,所以我对很多事情都不熟悉,包括我的代码中到底是什么导致了这个错误

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

int main()

{
    srand(time(NULL));

    char *symbols[] = {"Pineapple", "Kiwi", "Orange", "Lime", "Peach", 
    "Lemon", "Pear", "Banana", "Cherry", "Grape", "Blueberry", 
    "Blackberry", "Apricot"};


    int num1, num2, num3;
    int balance;

    printf("Enter initial balance (in cents): ");
    scanf("%d", &balance);


    num1 = (rand() % (13 - 0 + 1)) + 0;
    num2 = (rand() % (13 - 0 + 1)) + 0;
    num3 = (rand() % (13 - 0 + 1)) + 0;
    printf("%s ", symbols[num1]);
    printf("%s ", symbols[num2]);
    printf("%s ", symbols[num3]);
    printf("\n");

    if ((num1 == num2) && (num1 == num3))
    {
        printf("Congratulations! You have won $1");
        balance += 100;
        printf("\n");
    }

    balance -= 5;
    printf("Remaining Balance: %d", balance);

return 0;
}
#包括
#包括
#包括
int main()
{
srand(时间(空));
字符*符号[]={“菠萝”、“猕猴桃”、“橙子”、“酸橙”、“桃子”,
“柠檬”、“梨”、“香蕉”、“樱桃”、“葡萄”、“蓝莓”,
“黑莓”、“杏”};
int num1,num2,num3;
国际收支平衡;
printf(“输入初始余额(以美分为单位):”;
scanf(“%d”和余额);
num1=(rand()%(13-0+1))+0;
num2=(rand()%(13-0+1))+0;
num3=(rand()%(13-0+1))+0;
printf(“%s”,符号[num1]);
printf(“%s”,符号[num2]);
printf(“%s”,符号[num3]);
printf(“\n”);
如果((num1==num2)和&(num1==num3))
{
printf(“祝贺你!你赢了1美元”);
余额+=100;
printf(“\n”);
}
余额-=5;
printf(“剩余余额:%d”,余额);
返回0;
}
我所说的错误是随机发生的,我无法可靠地重现它。有时只打印1/3个水果名,我得到错误代码,有时是2个,有时没有打印。

语句
(rand()%(13-0+1))+0
相当于
rand()%14
,它将生成0-13(含0-13)之间的随机数。问题是您只有13个字符串,因此当rng抛出一个
13
时,索引
13
处的结果不存在

这可以通过添加另一个水果或将您的rng更改为
rand()%13
语句
(rand()%(13-0+1))+0来解决
相当于
rand()%14
,它将生成0-13(含0-13)之间的随机数。问题是您只有13个字符串,因此当rng抛出一个
13
时,索引
13
处的结果不存在

这可以通过添加其他水果或将rng更改为
rand()%13

来解决:

num1 = (rand() % (13 - 0 + 1)) + 0;
同:

num1 = rand() % 14;
这意味着你正在生成一个从0到13的数字。您的
符号
数组有13个元素,索引范围为0到12。因此,当您随机生成值13时,您读取的数据超过了数组的末尾。这样做会调用[undefined behavior]9https://en.wikipedia.org/wiki/Undefined_behavior),在这种情况下会导致程序崩溃

将该行和后面的两行更改为:

num1 = (rand() % 13;
num2 = (rand() % 13;
num3 = (rand() % 13;
这样你就可以得到一个从0到12的数字。

这个:

num1 = (rand() % (13 - 0 + 1)) + 0;
同:

num1 = rand() % 14;
这意味着你正在生成一个从0到13的数字。您的
符号
数组有13个元素,索引范围为0到12。因此,当您随机生成值13时,您读取的数据超过了数组的末尾。这样做会调用[undefined behavior]9https://en.wikipedia.org/wiki/Undefined_behavior),在这种情况下会导致程序崩溃

将该行和后面的两行更改为:

num1 = (rand() % 13;
num2 = (rand() % 13;
num3 = (rand() % 13;

这样您就得到了一个从0到12的数字。

您正在随机访问
符号
数组的无效第14个元素(包含13个元素)

当你写作时

 num1 = (rand() % (13 - 0 + 1)) + 0;
您正在尝试计算符号索引。但这可能导致指数13。。。而且
符号[13]
不存在,它将在访问不应该访问的内存位置时转换

简写

num1 = rand() % 13;

一切都会好起来。

您正在随机访问
符号
数组(包含13个元素)的无效第14个元素

当你写作时

 num1 = (rand() % (13 - 0 + 1)) + 0;
您正在尝试计算符号索引。但这可能导致指数13。。。而且
符号[13]
不存在,它将在访问不应该访问的内存位置时转换

简写

num1 = rand() % 13;
一切都会好起来。

为什么模数14(13-0+1)在
符号中只有13个条目
?为什么模数14(13-0+1)在
符号中只有13个条目