当前位置: 首页 > 知识库问答 >
问题:

在C中遇到分段故障

朱鹏
2023-03-14

编辑:底部的工作代码

我对编程相对较新,我正在试图理解为什么这不起作用。我决定通过一个函数而不是main()来处理卡片,以保持它尽可能模块化。这是我下面的代码;我知道错误与指针有关,但我不明白我做错了什么。

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

int dealCards (char* cards[52][30], int* x, int* y, int* a, int* b)
{
    time_t t;
    srand((unsigned) time(&t));

    printf("\n\nNow let's give you two random cards!\n\n");

    *x = rand() % 53;
    if (x != 0) {
        *x = x - 1;
    }

    *y = rand() % 53;
    if (y == x) {
        while (y == x) {
            y = rand() % 53;
        }
    }
    if (y != 0) {
        y = y - 1;
    }

    int i;
    printf("Card 1 >\n");
    for (i = 0; i < 30; i++) {
            printf("%c", cards[*x][i]);
        }
    printf("\nCard 2 >\n");
    for (i = 0; i < 30; i++) {
            printf("%c", cards[*y][i]);
        }

    printf("\n%d\n", x);
    printf("%d", y);

    printf("\n\nNow let's give your opponent two random cards!\n\n");

    *a = rand() % 53;
    if (a != 0) {
        a = a - 1;
    }
    if ((a == x) || (a == y)) {
        while ((a == x) || (a == y)) {
            *a = rand() % 53;
        }
    }

    *b = rand() % 53;
    if (b == a) {
        while ((b == a) || (b == x) || (b == y)) {
                *b = rand() % 53;
        }
    }
    if (b != 0) {
        *b = b - 1;
    }

    printf("Card 1 >\n");
    for (i = 0; i < 30; i++) {
            printf("%c", cards[*a][i]);
        }
    printf("\nCard 2 >\n");
    for (i = 0; i < 30; i++) {
            printf("%c", cards[*b][i]);
        }

    printf("\n%d\n", a);
    printf("%d", b);
}

int main()
{
    char deck[52][30] = { 
        {"_____\n|2♥ |\n|   |\n|_2♥|\n"},
        {"_____\n|3♥ |\n|   |\n|_3♥|\n"},
        {"_____\n|4♥ |\n|   |\n|_4♥|\n"},
        {"_____\n|5♥ |\n|   |\n|_5♥|\n"},
        {"_____\n|6♥ |\n|   |\n|_6♥|\n"},
        {"_____\n|7♥ |\n|   |\n|_7♥|\n"},
        {"_____\n|8♥ |\n|   |\n|_8♥|\n"},
        {"_____\n|9♥ |\n|   |\n|_9♥|\n"},
        {"_____\n|10♥|\n|   |\n|10♥|\n"},
        {"_____\n|J♥ |\n|   |\n|_J♥|\n"},
        {"_____\n|Q♥ |\n|   |\n|_Q♥|\n"},
        {"_____\n|K♥ |\n|   |\n|_K♥|\n"},
        {"_____\n|A♥ |\n|   |\n|_A♥|\n"},

        {"_____\n|2♦ |\n|   |\n|_2♦|\n"},
        {"_____\n|3♦ |\n|   |\n|_3♦|\n"},
        {"_____\n|4♦ |\n|   |\n|_4♦|\n"},
        {"_____\n|5♦ |\n|   |\n|_5♦|\n"},
        {"_____\n|6♦ |\n|   |\n|_6♦|\n"},
        {"_____\n|7♦ |\n|   |\n|_7♦|\n"},
        {"_____\n|8♦ |\n|   |\n|_8♦|\n"},
        {"_____\n|9♦ |\n|   |\n|_9♦|\n"},
        {"_____\n|10♦|\n|   |\n|10♦|\n"},
        {"_____\n|J♦ |\n|   |\n|_J♦|\n"},
        {"_____\n|Q♦ |\n|   |\n|_Q♦|\n"},
        {"_____\n|K♦ |\n|   |\n|_K♦|\n"},
        {"_____\n|A♦ |\n|   |\n|_A♦|\n"},

        {"_____\n|2♠ |\n|   |\n|_2♠|\n"},
        {"_____\n|3♠ |\n|   |\n|_3♠|\n"},
        {"_____\n|4♠ |\n|   |\n|_4♠|\n"},
        {"_____\n|5♠ |\n|   |\n|_5♠|\n"},
        {"_____\n|6♠ |\n|   |\n|_6♠|\n"},
        {"_____\n|7♠ |\n|   |\n|_7♠|\n"},
        {"_____\n|8♠ |\n|   |\n|_8♠|\n"},
        {"_____\n|9♠ |\n|   |\n|_9♠|\n"},
        {"_____\n|10♠|\n|   |\n|10♠|\n"},
        {"_____\n|J♠ |\n|   |\n|_J♠|\n"},
        {"_____\n|Q♠ |\n|   |\n|_Q♠|\n"},
        {"_____\n|K♠ |\n|   |\n|_K♠|\n"},
        {"_____\n|A♠ |\n|   |\n|_A♠|\n"},

        {"_____\n|2♣ |\n|   |\n|_2♣|\n"},
        {"_____\n|3♣ |\n|   |\n|_3♣|\n"},
        {"_____\n|4♣ |\n|   |\n|_4♣|\n"},
        {"_____\n|5♣ |\n|   |\n|_5♣|\n"},
        {"_____\n|6♣ |\n|   |\n|_6♣|\n"},
        {"_____\n|7♣ |\n|   |\n|_7♣|\n"},
        {"_____\n|8♣ |\n|   |\n|_8♣|\n"},
        {"_____\n|9♣ |\n|   |\n|_9♣|\n"},
        {"_____\n|10♣|\n|   |\n|10♣|\n"},
        {"_____\n|J♣ |\n|   |\n|_J♣|\n"},
        {"_____\n|Q♣ |\n|   |\n|_Q♣|\n"},
        {"_____\n|K♣ |\n|   |\n|_K♣|\n"},
        {"_____\n|A♣ |\n|   |\n|_A♣|\n"},
    };

    int i, j;
    for (i = 0; i < 52; i++) {
        for (j = 0; j < 30; j++) {
            printf("%c", deck[i][j]);
        }
    }

    //dealing
    int heroFirst, heroSecond, villainFirst, villainSecond;

    dealCards(deck, &heroFirst, &heroSecond, &villainFirst, &villainSecond);


    //bets
}

工作代码:

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

int dealCards (char cards[52][30], int *x, int *y, int *a, int *b)
{
    time_t t;
    srand((unsigned) time(&t));

    printf("\n\nYour cards:\n\n");

    *x = rand() % 53;
    if (*x != 0) {
        *x = *x - 1;
    }

    *y = rand() % 53;
    if (*y == *x) {
        while (*y == *x) {
            *y = rand() % 53;
        }
    }
    if (*y != 0) {
        *y = *y - 1;
    }

    int i;
    printf("Card 1 >\n");
    for (i = 0; i < 30; i++) {
            printf("%c", cards[*x][i]);
        }
    printf("\nCard 2 >\n");
    for (i = 0; i < 30; i++) {
            printf("%c", cards[*y][i]);
        }

    printf("\n\nVillain cards:\n\n");

    *a = rand() % 53;
    if (*a != 0) {
        *a = *a - 1;
    }
    if ((*a == *x) || (*a == *y)) {
        while ((*a == *x) || (*a == *y)) {
            *a = rand() % 53;
        }
    }

    *b = rand() % 53;
    if (*b == *a) {
        while ((*b == *a) || (*b == *x) || (*b == *y)) {
                *b = rand() % 53;
        }
    }
    if (*b != 0) {
        *b = *b - 1;
    }

    printf("Card 1 >\n");
    for (i = 0; i < 30; i++) {
            printf("%c", cards[*a][i]);
        }
    printf("\nCard 2 >\n");
    for (i = 0; i < 30; i++) {
            printf("%c", cards[*b][i]);
        }
}

int main()
{
    char deck[52][30] = { 
        {"_____\n|2♥ |\n|   |\n|_2♥|\n"},
        {"_____\n|3♥ |\n|   |\n|_3♥|\n"},
        {"_____\n|4♥ |\n|   |\n|_4♥|\n"},
        {"_____\n|5♥ |\n|   |\n|_5♥|\n"},
        {"_____\n|6♥ |\n|   |\n|_6♥|\n"},
        {"_____\n|7♥ |\n|   |\n|_7♥|\n"},
        {"_____\n|8♥ |\n|   |\n|_8♥|\n"},
        {"_____\n|9♥ |\n|   |\n|_9♥|\n"},
        {"_____\n|10♥|\n|   |\n|10♥|\n"},
        {"_____\n|J♥ |\n|   |\n|_J♥|\n"},
        {"_____\n|Q♥ |\n|   |\n|_Q♥|\n"},
        {"_____\n|K♥ |\n|   |\n|_K♥|\n"},
        {"_____\n|A♥ |\n|   |\n|_A♥|\n"},

        {"_____\n|2♦ |\n|   |\n|_2♦|\n"},
        {"_____\n|3♦ |\n|   |\n|_3♦|\n"},
        {"_____\n|4♦ |\n|   |\n|_4♦|\n"},
        {"_____\n|5♦ |\n|   |\n|_5♦|\n"},
        {"_____\n|6♦ |\n|   |\n|_6♦|\n"},
        {"_____\n|7♦ |\n|   |\n|_7♦|\n"},
        {"_____\n|8♦ |\n|   |\n|_8♦|\n"},
        {"_____\n|9♦ |\n|   |\n|_9♦|\n"},
        {"_____\n|10♦|\n|   |\n|10♦|\n"},
        {"_____\n|J♦ |\n|   |\n|_J♦|\n"},
        {"_____\n|Q♦ |\n|   |\n|_Q♦|\n"},
        {"_____\n|K♦ |\n|   |\n|_K♦|\n"},
        {"_____\n|A♦ |\n|   |\n|_A♦|\n"},

        {"_____\n|2♠ |\n|   |\n|_2♠|\n"},
        {"_____\n|3♠ |\n|   |\n|_3♠|\n"},
        {"_____\n|4♠ |\n|   |\n|_4♠|\n"},
        {"_____\n|5♠ |\n|   |\n|_5♠|\n"},
        {"_____\n|6♠ |\n|   |\n|_6♠|\n"},
        {"_____\n|7♠ |\n|   |\n|_7♠|\n"},
        {"_____\n|8♠ |\n|   |\n|_8♠|\n"},
        {"_____\n|9♠ |\n|   |\n|_9♠|\n"},
        {"_____\n|10♠|\n|   |\n|10♠|\n"},
        {"_____\n|J♠ |\n|   |\n|_J♠|\n"},
        {"_____\n|Q♠ |\n|   |\n|_Q♠|\n"},
        {"_____\n|K♠ |\n|   |\n|_K♠|\n"},
        {"_____\n|A♠ |\n|   |\n|_A♠|\n"},

        {"_____\n|2♣ |\n|   |\n|_2♣|\n"},
        {"_____\n|3♣ |\n|   |\n|_3♣|\n"},
        {"_____\n|4♣ |\n|   |\n|_4♣|\n"},
        {"_____\n|5♣ |\n|   |\n|_5♣|\n"},
        {"_____\n|6♣ |\n|   |\n|_6♣|\n"},
        {"_____\n|7♣ |\n|   |\n|_7♣|\n"},
        {"_____\n|8♣ |\n|   |\n|_8♣|\n"},
        {"_____\n|9♣ |\n|   |\n|_9♣|\n"},
        {"_____\n|10♣|\n|   |\n|10♣|\n"},
        {"_____\n|J♣ |\n|   |\n|_J♣|\n"},
        {"_____\n|Q♣ |\n|   |\n|_Q♣|\n"},
        {"_____\n|K♣ |\n|   |\n|_K♣|\n"},
        {"_____\n|A♣ |\n|   |\n|_A♣|\n"},
    };

    int i, j;
    for (i = 0; i < 52; i++) {
        for (j = 0; j < 30; j++) {
            printf("%c", deck[i][j]);
        }
    }

    double heroStack, villainStack;
    printf("\n-----------------------------");
    printf("\nWelcome to Heads Up Hold 'Em!");
    printf("\n-----------------------------");

    printf("\nHow many chips are your going to start off with?\n> ");
    scanf("%lf", &heroStack);
    villainStack = heroStack;

    printf("\nYour chipstack: %.lf\n", heroStack);
    printf("Villain's chipstack: %.lf\n", villainStack);

    //dealing
    int heroFirst, heroSecond, villainFirst, villainSecond;

    dealCards(deck, &heroFirst, &heroSecond, &villainFirst, &villainSecond);
    printf("\n%d\n", heroFirst);
    printf("%d\n", heroSecond);
    printf("%d\n", villainFirst);
    printf("%d\n", villainSecond);

    //bets
    //double heroBet, villainBet;
    //printf("\nYour move");
}

共有1个答案

史洛城
2023-03-14

问题是你在获取价值和计算价值之间混淆不清这个if(和类似的),你知道你在做什么吗?

*x=rand()%53;如果(x!=0){*x=x-1;}

嗯,x在函数中是一个指针,这意味着,如果你想获取或分配一个值,你必须像*x=rand()%53一样使用操作符*,但是当你比较x!=0时,编译器会认为您正在检查x是否为NULL(默认情况下,NULL为0)。所以,这不是上述语句的值,这将导致逻辑错误。

如果您仔细查看main,您应该会看到xy和您传递的类似参数永远不会为NULL,因为它们是在main函数中本地创建的,并且在您离开它之前仍然存在。因此,您的语句*x=x-1将意外工作,这可能会导致您的分段错误

我认为您正在使用交易函数来获取这些变量的随机值

int英雄第一,英雄第二,恶棍第一,恶棍第二;

因此,您可以通过如下方式声明函数来通过引用传递这些值:int dealCards(char cards[52][30],int

在您的发行卡定义中,只需删除像 *x之类的 *或类似的东西,您的函数就会正常工作(如果您知道要做什么,使用那些 x y此外,您可以安全地打印整个字符串,而无需像这样使用for循环,这看起来很糟糕,不是吗?

for(i=0;i

只需通过printf(“%s”,cards[*y])正常打印即可

埃迪特:

>

您应该按照上述评论重新声明您的cardDecks以使其正常工作

 类似资料:
  • 正在尝试读取输入。txt文件,并使用fscanf将行内容存储到int变量、数组和2D数组中,以便以后使用该值进行计算。我认为这里的问题是因为我没有使用fscanf处理“EOF”? 这是我的密码: 这是你的电话号码。txt输入文件: 这里是输出:

  • 我在用C++编写链表实现时遇到了一个问题。每当我试图添加一个元素,我得到分段错误错误。 提前感谢!

  • 问题内容: 我有一个用于捕获任何分段错误或ctrl- c的应用程序。使用下面的代码,我能够捕获分段错误,但是该处理程序一次又一次地被调用。我该如何阻止他们。供您参考,我不想退出我的申请。我只是可以小心释放所有损坏的缓冲区。 可能吗? 处理程序就是这样。 在这里,对于Segmentation故障信号,处理程序被多次调用,并且很明显MyfreeBuffers()给我释放已释放的内存的错误。我只想释放一

  • 我有一个便宜的5美元/月的服务器,1G内存为我的网站处理一些图像。在将GIF图像写入磁盘时,我很少会遇到PHP Imagick的分割错误。 我在console命令上设置了一个内存限制,希望PHP能够首先捕获这个问题,并抛出一个我可以正确处理的异常,但这不起作用。 特别的问题是某些GIF图像会导致它在这行代码中崩溃: 特定的GIF是与成人相关的GIF,因此我不确定是否可以共享它。 以下是我的服务器日

  • 我有一个应用程序,我用它来捕捉任何分割错误或ctrl-c。使用下面的代码,我能够捕获分段错误,但是处理程序被一次又一次地调用。我怎样才能阻止他们。告诉你,我不想退出我的申请。我只是可以小心释放所有损坏的缓冲区。 可能吗? handler是这样的。 这里的分段故障信号,处理程序被多次调用,因为明显的MyFreeBuffers()给我释放已经释放的内存的错误。我只想免费一次,但仍然不想退出应用程序。

  • 分段错误发生在 运行Glewinfo 运行VisualInfo 测试程序(详细信息如下) 调用glGetProgramInterfaceiv(详细信息如下) 使用gdb实现glewinfo的堆栈跟踪 使用gdb实现visualinfo的堆栈跟踪 下面是使用已安装的GLEW库和glfw3(3.0.3)的测试程序 编译: 运行前。/basic I设置 (否则我会得到分段错误,因为它试图使用安装的GLE