键盘输入的位数组

时间:2016-10-15 21:41:55

标签: c arrays vector

我想制作一个程序,将一些逻辑门(ANDORXOR)应用于两个1和0数组的元素。但是我遇到了问题用户输入这些数组。我不知道如何使数组只存储1和0,例如,如果我输入5,我希望程序告诉我它既不是0也不是1并重新开始,我尝试了一些东西,但它&# 39;不工作:

int v1[50],v2[50],i,j,n;
printf("Number of elements in arrays : ");
scanf("%d",&n);

printf("Introduce elements of first array :\n");

for(i=0;i<n;i++)
    if(v1[i] == 0 || v1[i]==1)
         scanf("%d",&v1[i]);
    else (i'll make it a function and I want it to repeat if the elements given are not 1 and 0)

for(i=0;i<n;i++)
    printf("%d",v1[i]);

2 个答案:

答案 0 :(得分:1)

在第一个for循环中,您正在读取输入,您应首先读取输入,然后决定是否要让用户再次尝试输入。因此,for循环的前几行应如下所示:

for (i = 0; i < n; i++) {
  scanf("%d", &v1[i]);
  if (!(v1[i] == 0 || v1[i] == 1)) {
    printf("Invalid input, please try again");
    //Ask for another input, but do not advance i
  }
}

此代码将告诉用户他们是否输入了错误字符,但它不会正确更新数组。要做到这一点,你需要做的就是减少一次。这将使v1中之前的“坏”值被覆盖。

for (i = 0; i < n; i++) {
  scanf("%d", &v1[i]);
  if (!(v1[i] == 0 || v1[i] == 1)) {
    printf("Invalid input, please try again");
    i--;
  }
}
但是,我们还没有完成。在原始代码中,您将v1定义为包含50个元素的数组。如果有人想输入51个元素怎么办?最终你最终会访问一个超出范围的数组索引,这可能会导致一些非常大的问题。因此,您需要使用malloc

进行一些动态内存分配
int *v1, i, n;

printf("How many elements will be in the bit array? ");
scanf("%d", &n);

//Dynamically allocate enough memory for an integer array of length n
v1 = (int *) malloc(n * sizeof(int));

您可以阅读有关malloc here的更多信息。 所以,整个代码看起来像这样:

#include <stdlib.h>
#include <stdio.h>

int main() {
  int *v1, i, n;

  printf("How many elements will be in the bit array? ");
  scanf("%d", &n);

  //Dynamically allocate enough memory for an integer array of length n
  v1 = (int *) malloc(n * sizeof(int));

  printf("Input the elements of the first array (separated by newlines):\n");

  for (i = 0; i < n; i++) {
    scanf("%d", &v1[i]);
    if (!(v1[i] == 0 || v1[i] == 1)) {
      printf("Invalid input, please try again");
      i--;
    }
  }

答案 1 :(得分:0)

假设您有一个由50个元素组成的数组:

int v1[50];

如果您希望仅使用01的值填充它,则应设置while循环,直到用户输入正确的数据:

int iter, result;
for (iter = 0; iter < 50; iter++)
{
    while ((result = scanf("%d", &v1[iter])) != 1  // no number was found
            || (v1[iter] != 0 && v1[iter] != 1))   // OR it was and it wasn't 0 or 1
    {
        if (result != 1)
            scanf("%*s");  // case 1: dispose of bad input
        else
            printf("Please, use only values 0 or 1\n");  // case 2: remind the user
        }  
    }
}