鱼C论坛

 找回密码
 立即注册
查看: 1581|回复: 20

[已解决]如何解决函数调用后下面的程序不执行的问题

[复制链接]
发表于 2020-7-13 11:52:05 | 显示全部楼层 |阅读模式

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

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

x
这个程序是打印出八名参赛者两两随机分组的结果以及键盘输入每轮比赛的胜者,我调用了随机分组的randomchoose函数,但是运行结果是函数调用函数下面的程序都不运行了,我想问一下这是怎么一回事,要如何解决呢?
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void randomchoose(char *p[],int b);
  4. int main()
  5. {
  6.         int i,j;
  7.         char *name[8]={
  8.                        "Alice","Bob","Tom","Mike","Ann","John","White","Jerry"
  9.                      };
  10.         int len=sizeof(name)/sizeof(name[0]);
  11.         randomchoose(*name[8],len);
  12.         for( i=0; i<len; i++)
  13.         {
  14.                 printf("%-8s",name[i]);
  15.                 if( (i+1)%2==0 )
  16.                         {printf("\n");
  17.                         printf("the winner of this one match is:");
  18.                         int k=(i+1)/2;char winner[4];
  19.                         scanf("%s",&winner[k-1]);}
  20.         }
  21.         printf("\n");
  22.         return 0;
  23. }
  24.   void randomchoose(char *p[],int b)
  25.   {
  26.     int j;int last=b-1;
  27.         srand( (unsigned)time(NULL) );
  28.         for(j=0;j<b-1;j++)
  29.         {
  30.                 int random=rand()%b;
  31.                 char *temp=p[last];
  32.                 p[last]=p[random];
  33.             p[random]=*temp;
  34.                 last--;
  35.         }
  36.     }
复制代码
最佳答案
2020-7-13 15:33:40
TSwangming 发表于 2020-7-13 15:29
嗯嗯,刚才试的成功了,太感谢你了。  但还是想麻烦您一下,我还想问问就是修改后的winner数组为什么变成 ...

因为要输入的是名字,名字是字符串,字符串是字符数组,所以要是二维的
如果它的定义在for循环内,那么每次循环都有一个新的二维数组,原来那个就没有了
另外,麻烦给个最佳~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-13 15:19:34 | 显示全部楼层
我又试了一下,这么改
1、将winner的声明放到开头,声明改为char winner[4][10]
2、scanf改成这样
  1. scanf("%s",winner[k-1]);
复制代码


---------------------------------
最后修改过的程序应该是这样的
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<time.h>
  4. void randomchoose(char *p[],int b);
  5. int main() {
  6.         int i,j;
  7.         char winner[4][10];
  8.         char *name[8]= {
  9.                 "Alice","Bob","Tom","Mike","Ann","John","White","Jerry"
  10.         };
  11.         int len=sizeof(name)/sizeof(name[0]);
  12.         randomchoose(name,len);
  13.         for( i=0; i<len; i++) {
  14.                 printf("%-8s",name[i]);
  15.                 if( (i+1)%2==0 ) {
  16.                         printf("\n");
  17.                         printf("the winner of this one match is:");
  18.                         int k=(i+1)/2;
  19.                         scanf("%s",winner[k-1]);
  20.                 }
  21.         }
  22.         printf("\n");
  23.         return 0;
  24. }
  25. void randomchoose(char *p[],int b) {
  26.         int j;
  27.         int last=b-1;
  28.         srand((unsigned)time(NULL));
  29.         for(j=0; j<b-1; j++) {
  30.                 int random=rand()%b;
  31.                 char *temp=p[last];
  32.                 p[last]=p[random];
  33.                 p[random]=temp;
  34.                 last--;
  35.         }
  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-13 13:15:40 | 显示全部楼层

randomchoose(*name[8],len);
改成
randomchoose(name,len);
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-7-13 13:46:53 | 显示全部楼层
lhgzbxhz 发表于 2020-7-13 13:15

randomchoose(*name[8],len);
改成

改完了,但结果还是和原来一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 14:05:42 | 显示全部楼层
TSwangming 发表于 2020-7-13 13:46
改完了,但结果还是和原来一样

问题主要出在这里
  1. char *temp=p[last];
  2. p[last]=p[random];
  3. p[random]=*temp;
复制代码

把最后的*temp改成temp试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-7-13 14:27:53 | 显示全部楼层
lhgzbxhz 发表于 2020-7-13 14:05
问题主要出在这里

把最后的*temp改成temp试试

刚试过了,还是不行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 14:31:38 | 显示全部楼层
TSwangming 发表于 2020-7-13 14:27
刚试过了,还是不行

你再加上#include<time.h>试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-7-13 14:44:53 | 显示全部楼层
刚刚还可以,不过当我键盘输入第一组的结果后程序就推出了,然后我又重试,又回到了最初的状态
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 14:56:32 | 显示全部楼层
TSwangming 发表于 2020-7-13 14:44
刚刚还可以,不过当我键盘输入第一组的结果后程序就推出了,然后我又重试,又回到了最初的状态

我这里没问题呀~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 14:58:02 | 显示全部楼层
lhgzbxhz 发表于 2020-7-13 14:56
我这里没问题呀~

可以让我看一下您那里的运行截图吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 14:58:50 | 显示全部楼层
TSwangming 发表于 2020-7-13 14:58
可以让我看一下您那里的运行截图吗

还有修改是不是把刚才您跟我说的三条建议都修改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 15:05:55 | 显示全部楼层
TSwangming 发表于 2020-7-13 14:58
还有修改是不是把刚才您跟我说的三条建议都修改

是的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 15:08:04 | 显示全部楼层
我这里发不了图,直接给你复制我的输出(黑体字表示我输入的)
Jerry   White
the winner of this one match is:Jerry
Alice   Bob
the winner of this one match is:Bob
Mike    Ann
the winner of this one match is:Ann
John    Tom
the winner of this one match is:Tom
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 15:11:50 | 显示全部楼层

我刚刚又按照三条都改后的试了一下,但是第一次试的时候就是输入第一组的winner然后就不往下执行了,第二次重试第一组winner都无法输入,直接就跟什么也不执行一样,我也不明白是什么原因
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 15:15:01 | 显示全部楼层
lhgzbxhz 发表于 2020-7-13 15:08
我这里发不了图,直接给你复制我的输出(黑体字表示我输入的)
Jerry   White
the winner of this one ma ...

难道是电脑的原因?还是软件的原因,我用的是codeblocks
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 15:29:10 | 显示全部楼层
lhgzbxhz 发表于 2020-7-13 15:19
我又试了一下,这么改
1、将winner的声明放到开头,声明改为char winner[4][10]
2、scanf改成这样

嗯嗯,刚才试的成功了,太感谢你了。  但还是想麻烦您一下,我还想问问就是修改后的winner数组为什么变成二维的了,我一开始没有将winner放在开头为什么就达不到效果,错误是什么呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 15:33:40 | 显示全部楼层    本楼为最佳答案   
TSwangming 发表于 2020-7-13 15:29
嗯嗯,刚才试的成功了,太感谢你了。  但还是想麻烦您一下,我还想问问就是修改后的winner数组为什么变成 ...

因为要输入的是名字,名字是字符串,字符串是字符数组,所以要是二维的
如果它的定义在for循环内,那么每次循环都有一个新的二维数组,原来那个就没有了
另外,麻烦给个最佳~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 15:41:44 | 显示全部楼层
lhgzbxhz 发表于 2020-7-13 15:33
因为要输入的是名字,名字是字符串,字符串是字符数组,所以要是二维的
如果它的定义在for循环内,那么 ...

嗯嗯谢谢了,刚才我把这个设成最佳答案了,刚刚用论坛不是太会操作,我觉得刚刚你发的修改后的代码也是最佳答案,但那个没办法再设置了,答主抱歉,新人不太会操作
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 16:16:59 | 显示全部楼层
lhgzbxhz 发表于 2020-7-13 15:19
我又试了一下,这么改
1、将winner的声明放到开头,声明改为char winner[4][10]
2、scanf改成这样

抱歉又打扰您了,刚刚我看代码的时候发现最后的代码char *temp=p[last];
                p[last]=p[random];
                p[random]=temp;这里,为什么第一个temp要加*,最后面的temp没加*
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 20:34:14 | 显示全部楼层
TSwangming 发表于 2020-7-13 16:16
抱歉又打扰您了,刚刚我看代码的时候发现最后的代码char *temp=p[last];
                p[last]=p[ran ...

因为p[random]是一个char*型变量,而temp也是一个char*型变量,所以不用加*
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 05:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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