Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C数组中正确获取随机位置_C_Random - Fatal编程技术网

从C数组中正确获取随机位置

从C数组中正确获取随机位置,c,random,C,Random,首先,我是C语言的新手,所以我一直在努力学习一些简单的东西。这就是我想从数组问题中随机选取问题的问题,我需要创建以下逻辑过程,程序将开始从数组中询问任何问题,在用户回答问题后,我想将回答保存在一个数组中,将问题保存在另一个数组中,我想保存已经问过的问题,因为我不想让程序重复这个问题,所以我会保存它并检查问题是否已经完成,我会保存答案,因为我会将正确的问题与另一个数组进行比较。这是我的密码 #include <stdio.h> #include <stdlib.h> #in

首先,我是C语言的新手,所以我一直在努力学习一些简单的东西。这就是我想从数组问题中随机选取问题的问题,我需要创建以下逻辑过程,程序将开始从数组中询问任何问题,在用户回答问题后,我想将回答保存在一个数组中,将问题保存在另一个数组中,我想保存已经问过的问题,因为我不想让程序重复这个问题,所以我会保存它并检查问题是否已经完成,我会保存答案,因为我会将正确的问题与另一个数组进行比较。这是我的密码

#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.) ....