2016-12-13 21 views
1

バイナリを10進数に変換するプログラムで作業しています。ユーザは元の数値を入力するか、qを押して終了します。私のwhileループは終了せず、qは10進数として解釈されます。これをやめてこの問題を回避する最善の方法は何ですか?以下は、期待される出力、実際の出力、私のコードです。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、STDIN)= STOP!)'のような単純な何かい - > 'しばらく(関数fgets(bnumber、10、標準入力を)&& bnumber [0]!= 'q') 'あなたのために働く? – chux

答えて

2

は、あなたがstrcmpで文字列を比較する必要が 、代わりの!=、これはCでは正しくありません。

ポインタの戻り値がからvoid*であることを確認することもお勧めします。これは、ヒープ上に動的配列の領域を割り当てるときに行うことをお勧めします。

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

あなたは、単に書くことができます。

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

代わりに:私はまた、あなたのヘッダーの1つとして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

私はそれを通常の終了とみなし、単に 'break'を使用します。 –

関連する問題