【问题标题】:C: While loop exit condition, using fgets for inputC:While循环退出条件,使用fgets作为输入
【发布时间】:2016-12-13 02:04:21
【问题描述】:

我正在开发一个将二进制转换为十进制的程序,用户输入原始数字或按 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;
}

【问题讨论】:

  • while (fgets(bnumber, 10, stdin) != STOP) --> while (fgets(bnumber, 10, stdin) &amp;&amp; bnumber[0] != 'q') 对你有用吗?

标签: c while-loop fgets


【解决方案1】:

正如其他人所说,您需要将字符串与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;
}

【讨论】:

  • 但是当用户输入停止字母时,您不应该退出错误。
  • 我认为这是一个正常的退出,只使用break
  • @Markovnikov 没问题,如果您喜欢这个答案,请打勾。
猜你喜欢
  • 2018-01-23
  • 2014-12-12
  • 2021-08-24
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多