2016-10-15 5 views
0

1과 0의 두 배열의 요소에 일부 논리 게이트 (AND, OR, XOR)를 적용하는 프로그램을 만들고 싶습니다.하지만이 배열의 사용자 입력에 문제가 있습니다. 배열을 1과 0 만 저장하는 방법을 모르겠다. 예를 들어 5를 입력하면 프로그램이 0도 1이 아니더라도 처음부터 다시 시도하지만 무언가 시도했지만 작동하지 않는다.키보드 배열의 비트 배열

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]); 
사용자가 올바른 데이터에두고 때까지, 당신이 while 루프를 설정해야합니다 10의 값을 채우기 위해 원하는 경우

int v1[50]; 

:

+0

스택 교환에 오신 것을 환영합니다! 앞으로 비슷한 문제를 찾는 사람들을 쉽게 찾을 수 있도록 질문을 수정했습니다. 그건 그렇고, 사용자가 세 번째 줄에서 1과 50 사이의 숫자를 입력하는 것에 의존하지 마십시오! –

답변

0

는 50 개 요소로 구성된 배열이 있다고 가정

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 
     } 
    } 
} 
+0

@ The Vee 편집 해 주셔서 감사합니다! 나는 여기서 초보자 일 뿐이며 구직자에 대한 응답을 빨리 작성하고 서식을 지정하는 데 어려움을 겪고 있습니다. 이제 내 게시물은 더 명확하고 유익한 내용을 보여줍니다! – MrDonMatti

+0

걱정할 필요가 없습니다 :-) 중요한 내용입니다. 코드 블록을 포맷하려면 각 행의 시작 부분에 4 개의 공백을 넣을 수 있습니다. 이것이 많은 작업이기 때문에 소스 코드 편집기 나 단축키가있는 동안 Ctrl + K (전체 블록이 선택된 상태에서 가장 잘 작동 함)를 수행하는 것이 좋습니다. –

1

입력을 읽는 첫 번째 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 
    } 
} 

이 코드는 사용자에게 말할 것이다, 그러나 그것은 올바르게 배열을 업데이트하지 않습니다. 이렇게하기 위해서, 당신이해야 할 일은 한 번 감소입니다. 그러면 이전에 "bad"값이 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--; 
    } 
    }