2016-12-13 8 views
1

바이너리를 10 진수로 변환하는 프로그램을 작성 중입니다. 사용자가 원래 숫자를 입력하거나 q를 눌러 종료합니다. 내 while 루프가 종료되지 않고 q가 십진수로 해석됩니다. 이 문제를 막고이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 아래 예상 출력, 실제 출력 및 내 코드입니다.C : while 루프 종료 조건, 입력에 fgets 사용

예상 출력 :

Enter binary byte or press q to quit: 111 
7 

Enter binary byte or press q to quit: q 
Goodbye! 

실제 outout :

Enter binary byte or press q to quit: 111 
7 

Enter binary byte or press q to quit: q 
65 

코드 :

다른 사람이 말했듯이
#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <string.h> 

#define STOP "q" 

int convertbinary(char *binarynumber); 


int main() 
{ 
    int binaryreturn; 
    char *bnumber; 
    int len; 
    bnumber = (char *) malloc(10 * sizeof(char *)); 

    printf("Enter binary byte or type q to quit:?\n"); 

    while (fgets(bnumber, 10, stdin) != STOP) 
    { 
     len = strlen(bnumber); 
     if (bnumber[len - 1] == '\n') 
     { 
      bnumber[len - 1] = 0; 
     } 
     else 
     { 
      //blank line 
     } 

     binaryreturn = convertbinary(bnumber); 
     printf("%d\n", binaryreturn); 
     printf("Enter binary byte or type q to quit:?\n"); 
    } 


    free(bnumber); 

    return 0; 
} 

int convertbinary(char *binarynumber) 
{ 
    int val = 0; 

    while (*binarynumber != '\0') 
     val = 2 * val + (*binarynumber++ - '0'); 

    return val; 
} 
+0

이 (!는 fgets (bnumber, 10, 표준 입력) = STOP) 동안'로 간단한 무언가를'->'동안 (는 fgets (bnumber, 10, 표준 입력) && bnumber [0]! = 'q')'너에게 도움이 되니? – chux

답변

2

, 당신은 strcmp로 문자열을 비교해야 대신 !=, C에서 올바르지 않습니다.

malloc에서 void* 포인터의 반환 값을 확인하는 것이 좋습니다. 이는 동적 배열의 공간을 힙에 할당 할 때 좋은 방법입니다.

You also don't need to cast the return value from malloc().

당신은 간단하게 작성할 수 있습니다

char *bnumber = malloc(10 * sizeof *bnumber); 

대신 : 나는 또한 당신이 당신의 헤더 중 하나로 math.h을 포함 것을보고

char *bnumber = (char *) malloc(10 * sizeof(char *)); //Note 

. 당신이 그것의 기능 중 하나를 사용하지 않기 때문에 헤더가 필요 없습니다.

또한 프로그램의 버그를 방지하는 데 도움이되므로이 예제에서 몇 가지 추가 오류 검사를 추가했습니다. 여기

코드입니다 :

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

#define BUFFSIZE 10 

int convertbinary(char *binarynumber); 

int 
main(void) { 
    int binaryreturn; 
    char *bnumber; 
    size_t currsize = BUFFSIZE, len; 
    const char *quit = "q"; 

    bnumber = malloc(currsize * sizeof *bnumber); 
    if (!bnumber) { 
     printf("Cannot allocate memory!\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("Enter binary byte or type q to quit: "); 
    while (fgets(bnumber, currsize, stdin) != NULL) { 
     len = strlen(bnumber); 

     if (len > 0) { 
      if (bnumber[len-1] == '\n') { 
       bnumber[len-1] = '\0'; 
      } else { 
       printf("Buffer Exceeds length of %d\n", BUFFSIZE); 
       exit(EXIT_FAILURE); 
      } 
     } 

     if (!*bnumber) { 
      printf("No number entered.\n"); 
      printf("\nEnter binary byte or type q to quit: "); 
     } else { 
      if (strcmp(bnumber, quit) == 0) { 
       printf("Goodbye\n"); 
       break; 
      } 

      binaryreturn = convertbinary(bnumber); 
      printf("binary number = %d\n", binaryreturn); 
      printf("\nEnter binary byte or type q to quit: "); 
     } 
    }  

    free(bnumber); 
    bnumber = NULL; 

    return 0; 
} 

int 
convertbinary(char *binarynumber) { 
    int val = 0; 

    while (*binarynumber != '\0') { 
     val = 2 * val + (*binarynumber++ - '0'); 
    } 

    return val; 
} 
+0

플러스'malloc' 오류를 잡기위한 것. –

+1

그러나 사용자가 정지 문자를 입력 할 때 오류 종료를해서는 안됩니다. –

+1

정상적인 종료라고 생각하고 '중단'만 사용하십시오. –