从C数组中正确获取随机位置
首先,我是C语言的新手,所以我一直在努力学习一些简单的东西。这就是我想从数组问题中随机选取问题的问题,我需要创建以下逻辑过程,程序将开始从数组中询问任何问题,在用户回答问题后,我想将回答保存在一个数组中,将问题保存在另一个数组中,我想保存已经问过的问题,因为我不想让程序重复这个问题,所以我会保存它并检查问题是否已经完成,我会保存答案,因为我会将正确的问题与另一个数组进行比较。这是我的密码从C数组中正确获取随机位置,c,random,C,Random,首先,我是C语言的新手,所以我一直在努力学习一些简单的东西。这就是我想从数组问题中随机选取问题的问题,我需要创建以下逻辑过程,程序将开始从数组中询问任何问题,在用户回答问题后,我想将回答保存在一个数组中,将问题保存在另一个数组中,我想保存已经问过的问题,因为我不想让程序重复这个问题,所以我会保存它并检查问题是否已经完成,我会保存答案,因为我会将正确的问题与另一个数组进行比较。这是我的密码 #include <stdio.h> #include <stdlib.h> #in
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
char questions[] = { 'a', 'b', 'c','d'};
char reply[4];
char aux[4];
int i =0;
time_t t;
srand((unsigned)time(&t));
do{
printf("%c\n", questions[rand()%4]);
scanf("%*c\n");
aux[i] = questions[rand()%4];
}while( i < 4);
return 0;
}
#包括
#包括
#包括
int main()
{
字符问题[]={a',b',c',d'};
char回复[4];
char-aux[4];
int i=0;
时间;
srand((未签名)时间(&t));
做{
printf(“%c\n”,问题[rand()%4]);
scanf(“%*c\n”);
aux[i]=问题[rand()%4];
}而(i<4);
返回0;
}
问题是,脚本在第一个问题中停止了,我无法获得其他的脚本,所以,请问我在这里做错了什么
我编辑了原始代码,我真的不知道它是否被允许,无论如何,我在代码中做了一些更改,基于我从这里得到的有用的答案,但代码保留了一个奇怪的行为,如果你编译它,你可以看到你只是能够介绍第一个答案,因为在你按下回车键后,它将列出所有数组问题中的值,有人可以向我解释为什么会发生这种情况,我试图消除代码中的错误,但a对错误没有任何线索
scanf("%c\n",reply[i]);
调用未定义的行为,因为%c
需要char*
,但传递了char
在这种情况下,reply
不在其他情况下使用,因此可以忽略输入。
这可以通过向输入说明符添加*
来实现,如
scanf("%*c\n");
如果要存储输入,请在回复[i]
之前添加&
,以获取存储输入位置的指针
scanf("%c\n",&reply[i]);
如果我理解你的问题,你想要一种每次都以随机顺序生成问题集的方法,确保你不会问同一个问题两次,同时确保所有问题都被问到——那么你想要用频率数组跟踪问到了什么问题。频率数组是一个数组,对象集合中的每个对象都有一个元素——从零开始初始化。(在本例中,您需要一个4元素数组-每个元素对应一个问题) 例如:
char questions[] = { 'a', 'b', 'c','d'};
int asked[4] = {0}; /* frequency array to track questions already asked */
开始时,ask
的所有元素都初始化为零。这表明没有人提出任何问题
为问题生成随机数时(例如,int q=rand()%4;
),检查ask
数组中的元素是否为零,如果为零,则询问该问题并递增:
asked[q]++; /* increment element of freq array noting asked */
如果问题已经被提出,那么asked[q]
将是非零的,您只需在该范围内生成另一个随机数,直到您找到一个尚未提出的问题,例如
while (asked[q]) /* loop if already marked in asked array */
q = rand() % 4; /* get new random 0 - 3 */
然后你确定你有一个问题没有被问到,你只是:
printf ("%c.) ....\n", questions[q]);
总而言之,你可以做到:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main (void)
{
char questions[] = { 'a', 'b', 'c','d'};
int asked[4] = {0}; /* frequency array to track questions already asked */
srand(time(NULL));
for (int i = 0; i < 4; i++) {
int q = rand() % 4; /* get random 0 - 3 */
while (asked[q]) /* loop if already marked in asked array */
q = rand() % 4; /* get new random 0 - 3 */
asked[q]++; /* increment element of freq array noting asked */
printf ("%c.) ....\n", questions[q]);
}
return 0;
}
或
仔细检查一下,让我知道我是否理解正确,或者你是否还有其他问题。这不可编译:
foo.c:19:20:错误:“array”未声明(首次用于此函数)
你能发布一个可编译的版本吗?你从不初始化I
,因此它将具有不确定的(看起来是随机的或垃圾)值。并且您的循环没有修改i
,这意味着循环条件完全错误。另外,scanf(“%s\n”,reply[i])
是非常错误的,因为%s
读取以空结尾的字符串,但是reply[i]
是单个char
。i
无论如何都是无效的(见我之前的评论)。谢谢你的回答,但是为什么要忽略输入呢?因为我需要将每个问题的答案保存在另一个数组中,我的意思是,有没有办法将它保存到while循环中?再次感谢,我做了你说的大部分事情,但有一些事情是错误的,因为在我输入第一个问题的答案后,其他问题列在一行中
$ ./bin/randquestions
a.) ....
d.) ....
c.) ....
b.) ....
$ ./bin/randquestions
d.) ....
c.) ....
a.) ....
b.) ....