C:循环退出条件时,使用fgets进行输入

时间:2016-12-13 02:04:22

标签: c while-loop fgets

我正在开发一个将二进制转换为十进制的程序,用户输入原始数字或按q退出。我的while循环没有退出,q被解释为十进制数。阻止这个并解决这个问题的最佳方法是什么?下面是预期的输出,实际输出和我的代码。

预期产出:

Enter binary byte or press q to quit: 111
7

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

实际外出:

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;
}

1 个答案:

答案 0 :(得分:2)

正如其他人所说,您需要将字符串与strcmp进行比较,而不是!=,因为这在C中不正确。

我还建议检查来自mallocvoid*指针的返回值,因为这是在堆上为动态数组分配空间时的好习惯。

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

您可以简单地写一下:

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

而不是:

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

我还看到您将math.h作为标题之一。不需要该标题,因为您没有使用它的任何功能。

我还在此示例中添加了一些额外的错误检查,因为它有助于防止程序中的错误。

这是代码:

#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;
}