这是我的功能:我需要随机获得的每个数字都是:一个大于50,一个是偶数,一个不是偶数。我只使用gcc和我使用c99。编译得很好,但是当它打印三个随机数时,它打印0,0和真正的随机数。我希望它能为我打印三个实数。感谢谁试图帮助!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define HIGH_NUMBER 100
int isValidNumbers(int num1,int num2, int num3);
int main(void)
{
srand (time(NULL));
int num1 = 0;
int num2 = 0;
int num3 = 0;
num1,num2,num3 =isValidNumbers(num1,num2,num3);
printf("%d %d %d\n",num1,num2,num3);
system("PAUSE");
return 0;
}
int isValidNumbers(int num1,int num2, int num3)
{
int i=1,ans = 0;
do
{
srand (time(NULL));
num1 = rand()%HIGH_NUMBER;
num2 = rand()%HIGH_NUMBER;
num3 = rand()%HIGH_NUMBER;
if ((num1%2==0||num2%2||num3%2==0)&&(num1%2==1||num2%2==1||num3%2==1)&&(num1>50||num2>50||num3>50))
{
return num1,num2,num3;
i--;
printf("%d %d %d",num1,num2,num3);
}
}
while (i);
}
答案 0 :(得分:2)
您的函数未按您的意愿设置调用变量。您不能返回多个函数值 - 并且您对main
和函数中的变量赋予相同的名称没有区别 - 它们是不同的变量,当你写下它时,main
只传递那些变量值的副本。
相反,我将指针传递给此示例中的那些变量。我还删除了函数的返回值,因为它现在总是返回有效值作为您的规范。
我删除了函数中的srand
。它应该只被调用一次,特别是当我在这个例子中调用该函数3次以显示不同的结果时。如果留在函数中,则所有3个调用可能都会给出相同的结果(除非桥接了一秒计时器边界)。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define HIGH_NUMBER 100
void ValidNumbers(int *num1, int *num2, int *num3); // pointer arguments
int main(void)
{
int num1 = 0;
int num2 = 0;
int num3 = 0;
int tries;
srand ((unsigned)time(NULL)); // call once
for(tries=0; tries<3; tries++) {
ValidNumbers(&num1, &num2, &num3);
printf("%-2d %-2d %-2d\n", num1, num2, num3);
}
return 0;
}
void ValidNumbers(int *num1, int *num2, int *num3)
{
do {
*num1 = rand() % HIGH_NUMBER; // write through pointer of passed var
} while (*num1 <= 50); // number > 50
do {
*num2 = rand() % HIGH_NUMBER;
} while (*num2 % 2 != 0); // even number
do {
*num3 = rand() % HIGH_NUMBER;
} while (*num3 % 2 == 0); // odd number
}
节目输出:
79 16 79
95 2 37
73 28 93
答案 1 :(得分:1)
C
中不允许返回多个值。所以
return num1,num2,num3;
这不起作用。
您可以使用带有struct
号码的3
并将其返回。您可以通过this获取有关如何进行操作的示例。
另请注意if
语句后面return
内的语句永远不会执行,因此无用..
return num1,num2,num3;
i--; // <-- this will never get executed
printf("%d %d %d",num1,num2,num3); // <-- this will never get executed
答案 2 :(得分:0)
C中有两种方法可以返回多个参数 上面提到的一个使用1 struct来保存struct中的所有返回值。
另一个是使用指针/地址来保存值。
我修改了脚本以显示两种方式。我将为HelloWorld添加一个积极的评论,你们太苛刻了,这是c中的一个重要概念:
#include <stdlib.h>
#include <stdio.h>
#define HIGH_NUMBER 100
typedef struct Random Random;
Random *isValidNumbers(int *num1,int *num2, int *num3);
struct Random{
int a;
int b;
int c;
};
int main(void)
{
int num1 = 0;
int num2 = 0;
int num3 = 0;
/* pr to use as parameter, rr used as a return struct , just for demoo purpuse*/
Random *p;
p = isValidNumbers(&num1,&num2,&num3);
printf("%d %d %d main return random numbers\n",num1,num2,num3);
printf("%d %d %d main return from struct \n",p->a,p->b,p->c);
return 0;
}
Random *isValidNumbers(int *num1,int *num2, int *num3)
{
struct Random *r = malloc(sizeof(Random));
int i=1,ans = 0;
do
{
srand (time(NULL));
*num1 = rand()%HIGH_NUMBER;
*num2 = rand()%HIGH_NUMBER;
*num3 = rand()%HIGH_NUMBER;
r->a = *num1;
r->b = *num2;
r->c = *num3;
if ((*num1%2==0||*num2%2||*num3%2==0)&&(*num1%2==1||*num2%2==1||*num3%2==1)&&(*num1>50||*num2>50||*num3>50))
{
i--;
printf("%d %d %d inside isValidNumber\n",*num1,*num2,*num3);
break;
}
}
while (i);
return r;
}
结果:
cmake28 ..
make
[gliang@www build]$ ./src/random
99 99 44 inside isValidNumber
99 99 44 main return random numbers
99 99 44 main return from struct