鱼C论坛

 找回密码
 立即注册
查看: 1172|回复: 7

[已解决]我看不太懂我到底那里错了(进来看图一目了然)

[复制链接]
发表于 2020-2-20 18:25:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

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


asd.png

最佳答案
2020-2-20 19:12:14
本帖最后由 jackz007 于 2020-2-20 19:25 编辑

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

        这些语句:
  1.         . . . . . .
  2.         char * player[3]          ;
  3.         . . . . . .
  4.         s_scanf("%s" , player[1]) ;
  5.         . . . . . .        
复制代码

       改成下面这样试试
  1.         . . . . . .        
  2.         char player[3][256]             ;
  3.         . . . . . .
  4.         s_scanf("%s" , player[1] , 256) ;
  5.         . . . . . .
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-20 18:26:19 | 显示全部楼层
发完整代码,不要只发个图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 18:38:00 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>

  4. #define MAX 18

  5. int xipai(int);
  6. void fapai(int);
  7. int type_j(int);

  8. int main()
  9. {
  10.     char* player[3];
  11.     unsigned pai = 54;


  12.     int i, p, j;
  13.     for (i = 0; i < 3; i++)
  14.     {
  15.         printf("请输入%d号玩家的ID:", i + 1);
  16.         scanf_s("%s",player[1]);
  17.     }

  18.     for (i = 0; i < 3; i++)
  19.     {
  20.         printf("%s", player[i]);
  21.         for (j = 0; j < MAX; j++)
  22.         {
  23.             p = xipai(pai);
  24.             putchar('\b');
  25.             fapai(p);
  26.         }
  27.         printf("\n");
  28.     }
  29. }

  30. int xipai(int pai)
  31. {
  32.     int p;
  33.     time_t t;
  34.     srand((unsigned)time(&t));
  35.     p = rand() % pai - 1;
  36.     p++;
  37.     return p;
  38. }
  39. //判断,可跳过
  40. void fapai(int p)
  41. {
  42.     char* type = NULL;
  43.     if (p <= 10)             type = "方";
  44.     else if (p <= 20)
  45.     {
  46.         type = "梅";
  47.         p = p % 10;
  48.     }
  49.     else if (p <= 30)
  50.     {
  51.         type = "红";
  52.         p = p % 20;
  53.     }
  54.     else if (p <= 40)
  55.     {
  56.         type = "黑";
  57.         p = p % 30;
  58.     }
  59.     else if (p <= 43)
  60.     {
  61.         type = "方";
  62.         type_j(p);
  63.     }
  64.     else if (p <= 46)
  65.     {
  66.         type = "梅";
  67.         type_j(p);
  68.     }
  69.     else if (p <= 49)
  70.     {
  71.         type = "红";
  72.         type_j(p);
  73.     }
  74.     else if (p <= 52)
  75.     {
  76.         type = "黑";
  77.         type_j(p);
  78.     }
  79.     else if (p == 53)
  80.     {
  81.         printf("小王");
  82.         return;
  83.     }
  84.     else if (p == 54)
  85.     {
  86.         printf("大王");
  87.         return;
  88.     }

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

  91. }

  92. int type_j(int p)
  93. {
  94.     p = p % 40;
  95.     switch (p % 3)
  96.     {
  97.     case 1:return 81 - 48;
  98.     case 2:return 75 - 48;
  99.     case 0:return 74 - 48;
  100.     }
  101. }
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 18:39:46 | 显示全部楼层
我真的就是见了鬼,我慢慢写得跟规则一样,却给我报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 19:12:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-2-20 19:25 编辑

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

        这些语句:
  1.         . . . . . .
  2.         char * player[3]          ;
  3.         . . . . . .
  4.         s_scanf("%s" , player[1]) ;
  5.         . . . . . .        
复制代码

       改成下面这样试试
  1.         . . . . . .        
  2.         char player[3][256]             ;
  3.         . . . . . .
  4.         s_scanf("%s" , player[1] , 256) ;
  5.         . . . . . .
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-20 19:24:45 | 显示全部楼层
jackz007 发表于 2020-2-20 19:12
这些语句:

       改成下面这样试试

我获得的不应该是一个地址么,为什么我还需要规定这个后面的元素个数,求解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


        变量 player 申请的空间必须能够保存键盘输入数据。
  1.         char * player[3] ;
复制代码

        定义 player 为有 3 个元素的一维指针数组,对于 32 位的程序而言,每个指针的长度占用 4 个字节,那么,player 申请到的空间是 4 * 3 = 12 个字节;
  1.         char player[3][256] ;
复制代码

        定义 player 为 256 x 3 的二维字符数组,每个字符占用 1 个字节,那么,player 申请到的空间是 256 * 3 = 768 字节。

        由此可见,两种定义申请到的 player 空间大小完全不同,性质和用途也完全不同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 19:38:37 | 显示全部楼层
jackz007 发表于 2020-2-20 19:36
变量 player 申请的空间必须能够保存键盘输入数据。

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

好的,明白了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 11:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表