此代码有什么问题?
#include <stdio.h>
#include <stdlib.h>
#include "time.h"
void createNumb(int RandomNumber) {
srand(time(NULL));
int a, b, c, d;
a = rand() % 10 + 0;
b = rand() % 10 + 0;
c = rand() % 10 + 0;
d = rand() % 10 + 0;
while (b == a) {
b = rand() % 10 + 0;
}
while (c == b || c == a) {
c = rand() % 10 + 0;
}
while (d == c || d == b || d == a) {
d = rand() % 10 + 0;
}
RandomNumber = ("%d%d%d%d", a * 1000 + b * 100 + c * 10 + d * 1);
}
int main() {
int x;
createNumb(x);
printf("%d", x);
}
当我运行此程序时,它总是给我结果0
。
我希望它能够打印一个随机的4位数字(每个数字必须是唯一的)。有什么问题?
答案 0 :(得分:3)
createNumb
函数返回void
而不是int
。 srand()
次,因此最好将其移至main
。您的createNumb
函数应该返回一个随机整数,如下所示:
int createNumb(void) {
/*
** Simplified for readability.
** Here you would use your function that generates 4 different digits
*/
return rand();
}
int main(void) {
srand(time(NULL))(
int x = createNumb();
printf("%d" , x);
}
或者,如果您希望createNumb
填充现有整数,请使用pointer:
void createNumb(int *randomNumber) {
/*
** Simplified for readability.
** Here you would use your function that generates 4 different digits
*/
*randomNumber = rand();
}
int main(void) {
int x;
srand(time(NULL))
createNumb(&x); // Passing a pointer to x
printf("%d" , x);
}
答案 1 :(得分:2)
您的C代码存在一些问题,来自不同的语言:
return
从函数返回一个值,并在函数名称之前指定返回类型。RandomNumber = ("%d%d%d%d", a * 1000 + b * 100 + c * 10 + d * 1);
使用忽略其左操作数的运算符,
并求值为右操作数,其值存储在具有自动存储持续时间的局部变量中,并在函数退出时丢失。只需使用return a * 1000 + b * 100 + c * 10 + d * 1;
。rand() % 10000
,但可能需要更多数字或特殊约束(如唯一数字)等方法。srand()
使用更快的更改源,例如clock()
,并在main()
函数中初始化伪随机数生成器。printf
格式"%04d"
显示初始0
。以下是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int createNumb(void) {
int a, b, c, d;
a = rand() % 10;
b = rand() % 10;
c = rand() % 10;
d = rand() % 10;
while (b == a) {
b = rand() % 10;
}
while (c == b || c == a) {
c = rand() % 10;
}
while (d == c || d == b || d == a) {
d = rand() % 10;
}
return a * 1000 + b * 100 + c * 10 + d;
}
int main() {
int x;
srand(clock());
x = createNumb();
printf("%04d\n", x);
return 0;
}
请注意,您可以避免creatNumb()
中的循环。这是一个修改版本,它从命令行获取一个参数以产生多个结果。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int createNumb(void) {
int a, b, c, d, bb, cc, dd;
a = rand() % 10;
b = rand() % 9;
c = rand() % 8;
d = rand() % 7;
bb = (b >= a);
cc = (c >= a) + (c >= b);
cd = (d >= a) + (d >= b) + (d >= c);
return a * 1000 + (b + bb) * 100 + (c + cc) * 10 + (d + dd);
}
int main(int argc, char *argv[]) {
int x, n;
srand(clock());
n = (argc > 1) ? strtol(argv[1], NULL, 0) : 1;
while (n-- > 0) {
x = createNumb();
printf("%04d\n", x);
}
return 0;
}
布尔运算符在为真时评估为1
,否则为0
。 bb = (b >= a);
是一个简短的表示法:
bb = 0;
if (b >= a)
bb = 1;
如果要计算具有给定约束的4个数字的数组,则应将指向目标数组的指针作为creatNumb()
的参数传递。以下是使用此方法的修改版本:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void createNumb(int *dest) {
int a, b, c, d, bb, cc, dd;
a = rand() % 10;
b = rand() % 9;
c = rand() % 8;
d = rand() % 7;
bb = (b >= a);
cc = (c >= a) + (c >= b);
cd = (d >= a) + (d >= b) + (d >= c);
dest[0] = a;
dest[1] = b + bb;
dest[2] = c + cc;
dest[3] = d + dd;
}
int main(int argc, char *argv[]) {
int array[4];
srand(clock());
createNumb(array);
printf("%d%d%d%d\n", array[0], array[1], array[2], array[3]);
return 0;
}
请注意,将数组作为参数传递给函数实际上会将指针传递给其第一个元素:createNumb(array);
等同于createNumb(&array[0]);
。这个过程被称为数组在大多数表达式上下文中衰减为指针,它对于初学者来说有点混乱但允许有效的参数传递。