TSwangming 发表于 2020-7-13 11:52:05

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

这个程序是打印出八名参赛者两两随机分组的结果以及键盘输入每轮比赛的胜者,我调用了随机分组的randomchoose函数,但是运行结果是函数调用函数下面的程序都不运行了,我想问一下这是怎么一回事,要如何解决呢?
#include <stdio.h>
#include <stdlib.h>
void randomchoose(char *p[],int b);
int main()
{
        int i,j;
        char *name={
                       "Alice","Bob","Tom","Mike","Ann","John","White","Jerry"
                   };
        int len=sizeof(name)/sizeof(name);
        randomchoose(*name,len);
        for( i=0; i<len; i++)
        {
                printf("%-8s",name);
                if( (i+1)%2==0 )
                        {printf("\n");
                        printf("the winner of this one match is:");
                        int k=(i+1)/2;char winner;
                        scanf("%s",&winner);}
        }
        printf("\n");
        return 0;
}
void randomchoose(char *p[],int b)
{
    int j;int last=b-1;
        srand( (unsigned)time(NULL) );
        for(j=0;j<b-1;j++)
        {
                int random=rand()%b;
                char *temp=p;
                p=p;
          p=*temp;
                last--;
        }
    }

lhgzbxhz 发表于 2020-7-13 15:19:34

我又试了一下,这么改
1、将winner的声明放到开头,声明改为char winner
2、scanf改成这样
scanf("%s",winner);

---------------------------------
最后修改过的程序应该是这样的#include <stdio.h>
#include <stdlib.h>
#include<time.h>
void randomchoose(char *p[],int b);
int main() {
        int i,j;
        char winner;
        char *name= {
                "Alice","Bob","Tom","Mike","Ann","John","White","Jerry"
        };
        int len=sizeof(name)/sizeof(name);
        randomchoose(name,len);
        for( i=0; i<len; i++) {
                printf("%-8s",name);
                if( (i+1)%2==0 ) {
                        printf("\n");
                        printf("the winner of this one match is:");
                        int k=(i+1)/2;
                        scanf("%s",winner);
                }
        }
        printf("\n");
        return 0;
}
void randomchoose(char *p[],int b) {
        int j;
        int last=b-1;
        srand((unsigned)time(NULL));
        for(j=0; j<b-1; j++) {
                int random=rand()%b;
                char *temp=p;
                p=p;
                p=temp;
                last--;
        }
}

lhgzbxhz 发表于 2020-7-13 13:15:40


randomchoose(*name,len);
改成
randomchoose(name,len);

TSwangming 发表于 2020-7-13 13:46:53

lhgzbxhz 发表于 2020-7-13 13:15

randomchoose(*name,len);
改成


改完了,但结果还是和原来一样

lhgzbxhz 发表于 2020-7-13 14:05:42

TSwangming 发表于 2020-7-13 13:46
改完了,但结果还是和原来一样

问题主要出在这里
char *temp=p;
p=p;
p=*temp;
把最后的*temp改成temp试试

TSwangming 发表于 2020-7-13 14:27:53

lhgzbxhz 发表于 2020-7-13 14:05
问题主要出在这里

把最后的*temp改成temp试试

刚试过了,还是不行

lhgzbxhz 发表于 2020-7-13 14:31:38

TSwangming 发表于 2020-7-13 14:27
刚试过了,还是不行

你再加上#include<time.h>试试

TSwangming 发表于 2020-7-13 14:44:53

刚刚还可以,不过当我键盘输入第一组的结果后程序就推出了,然后我又重试,又回到了最初的状态

lhgzbxhz 发表于 2020-7-13 14:56:32

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

我这里没问题呀~

TSwangming 发表于 2020-7-13 14:58:02

lhgzbxhz 发表于 2020-7-13 14:56
我这里没问题呀~

可以让我看一下您那里的运行截图吗

TSwangming 发表于 2020-7-13 14:58:50

TSwangming 发表于 2020-7-13 14:58
可以让我看一下您那里的运行截图吗

还有修改是不是把刚才您跟我说的三条建议都修改

lhgzbxhz 发表于 2020-7-13 15:05:55

TSwangming 发表于 2020-7-13 14:58
还有修改是不是把刚才您跟我说的三条建议都修改

是的

lhgzbxhz 发表于 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

TSwangming 发表于 2020-7-13 15:11:50

lhgzbxhz 发表于 2020-7-13 15:05
是的

我刚刚又按照三条都改后的试了一下,但是第一次试的时候就是输入第一组的winner然后就不往下执行了,第二次重试第一组winner都无法输入,直接就跟什么也不执行一样,我也不明白是什么原因

TSwangming 发表于 2020-7-13 15:15:01

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

难道是电脑的原因?还是软件的原因,我用的是codeblocks

TSwangming 发表于 2020-7-13 15:29:10

lhgzbxhz 发表于 2020-7-13 15:19
我又试了一下,这么改
1、将winner的声明放到开头,声明改为char winner
2、scanf改成这样


嗯嗯,刚才试的成功了,太感谢你了。但还是想麻烦您一下,我还想问问就是修改后的winner数组为什么变成二维的了,我一开始没有将winner放在开头为什么就达不到效果,错误是什么呀

lhgzbxhz 发表于 2020-7-13 15:33:40

TSwangming 发表于 2020-7-13 15:29
嗯嗯,刚才试的成功了,太感谢你了。但还是想麻烦您一下,我还想问问就是修改后的winner数组为什么变成 ...

因为要输入的是名字,名字是字符串,字符串是字符数组,所以要是二维的
如果它的定义在for循环内,那么每次循环都有一个新的二维数组,原来那个就没有了
另外,麻烦给个最佳~

TSwangming 发表于 2020-7-13 15:41:44

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

嗯嗯谢谢了,刚才我把这个设成最佳答案了,刚刚用论坛不是太会操作,我觉得刚刚你发的修改后的代码也是最佳答案,但那个没办法再设置了,答主抱歉,新人不太会操作

TSwangming 发表于 2020-7-13 16:16:59

lhgzbxhz 发表于 2020-7-13 15:19
我又试了一下,这么改
1、将winner的声明放到开头,声明改为char winner
2、scanf改成这样


抱歉又打扰您了,刚刚我看代码的时候发现最后的代码char *temp=p;
                p=p;
                p=temp;这里,为什么第一个temp要加*,最后面的temp没加*

lhgzbxhz 发表于 2020-7-13 20:34:14

TSwangming 发表于 2020-7-13 16:16
抱歉又打扰您了,刚刚我看代码的时候发现最后的代码char *temp=p;
                p=p

因为p是一个char*型变量,而temp也是一个char*型变量,所以不用加*
页: [1] 2
查看完整版本: 如何解决函数调用后下面的程序不执行的问题