BIYU 发表于 2020-2-20 18:25:52

我看不太懂我到底那里错了(进来看图一目了然)


我tm被折腾了一个小时,也都去查过了,看不明白,重启也重启过了




zltzlt 发表于 2020-2-20 18:26:19

发完整代码,不要只发个图

BIYU 发表于 2020-2-20 18:38:00

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

#define MAX 18

int xipai(int);
void fapai(int);
int type_j(int);

int main()
{
    char* player;
    unsigned pai = 54;


    int i, p, j;
    for (i = 0; i < 3; i++)
    {
      printf("请输入%d号玩家的ID:", i + 1);
      scanf_s("%s",player);
    }

    for (i = 0; i < 3; i++)
    {
      printf("%s", player);
      for (j = 0; j < MAX; j++)
      {
            p = xipai(pai);
            putchar('\b');
            fapai(p);
      }
      printf("\n");
    }
}

int xipai(int pai)
{
    int p;
    time_t t;
    srand((unsigned)time(&t));
    p = rand() % pai - 1;
    p++;
    return p;
}
//判断,可跳过
void fapai(int p)
{
    char* type = NULL;
    if (p <= 10)             type = "方";
    else if (p <= 20)
    {
      type = "梅";
      p = p % 10;
    }
    else if (p <= 30)
    {
      type = "红";
      p = p % 20;
    }
    else if (p <= 40)
    {
      type = "黑";
      p = p % 30;
    }
    else if (p <= 43)
    {
      type = "方";
      type_j(p);
    }
    else if (p <= 46)
    {
      type = "梅";
      type_j(p);
    }
    else if (p <= 49)
    {
      type = "红";
      type_j(p);
    }
    else if (p <= 52)
    {
      type = "黑";
      type_j(p);
    }
    else if (p == 53)
    {
      printf("小王");
      return;
    }
    else if (p == 54)
    {
      printf("大王");
      return;
    }

    printf("%s", type);
    printf("%c", p + 48);

}

int type_j(int p)
{
    p = p % 40;
    switch (p % 3)
    {
    case 1:return 81 - 48;
    case 2:return 75 - 48;
    case 0:return 74 - 48;
    }
}


BIYU 发表于 2020-2-20 18:39:46

我真的就是见了鬼,我慢慢写得跟规则一样,却给我报错

jackz007 发表于 2020-2-20 19:12:14

本帖最后由 jackz007 于 2020-2-20 19:25 编辑

      player 是按指针数组的数据类型定义的,只能存放 3 个字符型指针,并没有存放字符串的空间,出错的原因是,s_scanf("%s" , player) ; 语句把键盘输入的字符保存到了 player 所指向的地址空间,而 player 并没有经过赋值,所以,这个地址绝对是无效的,出错是跑不脱的。

      这些语句:
      . . . . . .
      char * player          ;
      . . . . . .
      s_scanf("%s" , player) ;
      . . . . . .      
       改成下面这样试试
      . . . . . .      
      char player             ;
      . . . . . .
      s_scanf("%s" , player , 256) ;
      . . . . . .

BIYU 发表于 2020-2-20 19:24:45

jackz007 发表于 2020-2-20 19:12
这些语句:

       改成下面这样试试

我获得的不应该是一个地址么,为什么我还需要规定这个后面的元素个数,求解答

jackz007 发表于 2020-2-20 19:36:30

BIYU 发表于 2020-2-20 19:24
我获得的不应该是一个地址么,为什么我还需要规定这个后面的元素个数,求解答

      变量 player 申请的空间必须能够保存键盘输入数据。
      char * player ;
      定义 player 为有 3 个元素的一维指针数组,对于 32 位的程序而言,每个指针的长度占用 4 个字节,那么,player 申请到的空间是 4 * 3 = 12 个字节;
      char player ;
      定义 player 为 256 x 3 的二维字符数组,每个字符占用 1 个字节,那么,player 申请到的空间是 256 * 3 = 768 字节。

      由此可见,两种定义申请到的 player 空间大小完全不同,性质和用途也完全不同。

BIYU 发表于 2020-2-20 19:38:37

jackz007 发表于 2020-2-20 19:36
变量 player 申请的空间必须能够保存键盘输入数据。

      定义 player 为有 3 个元素的 ...

好的,明白了,谢谢
页: [1]
查看完整版本: 我看不太懂我到底那里错了(进来看图一目了然)