C:当循环退出条件时,使用FGET作为输入

C:当循环退出条件时,使用FGET作为输入,c,while-loop,fgets,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

我正在编写一个程序,将二进制转换为十进制,用户输入原始数字或按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
代码:

#包括
#包括
#包括
#包括
#定义停止“q”
int convertbinary(字符*二进制数);
int main()
{
int二进制返回;
字符*b编号;
内伦;
bnumber=(char*)malloc(10*sizeof(char*));
printf(“输入二进制字节或键入q退出:?\n”);
while(fgets(bnumber,10,stdin)!=停止)
{
len=strlen(b编号);
如果(b编号[len-1]='\n')
{
b编号[len-1]=0;
}
其他的
{
//空行
}
binaryreturn=convertbinary(bnumber);
printf(“%d\n”,二进制返回);
printf(“输入二进制字节或键入q退出:?\n”);
}
免费(bnumber);
返回0;
}
int convertbinary(字符*二进制数)
{
int-val=0;
而(*binarynumber!='\0')
val=2*val+(*binarynumber++-'0');
返回val;
}

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

我还建议检查来自的
void*
指针的返回值,因为在为堆上的动态数组分配空间时,这是一种很好的做法

你可以简单地写:

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;
}
#包括
#包括
#包括
#定义大小10
int convertbinary(字符*二进制数);
int
主(空){
int二进制返回;
字符*b编号;
大小\u t currsize=BUFFSIZE,len;
常量字符*quit=“q”;
b编号=malloc(currsize*sizeof*b编号);
如果(!bnumber){
printf(“无法分配内存!\n”);
退出(退出失败);
}
printf(“输入二进制字节或键入q退出:”;
while(fgets(bnumber,currsize,stdin)!=NULL){
len=strlen(b编号);
如果(len>0){
如果(b编号[len-1]='\n'){
b编号[len-1]='\0';
}否则{
printf(“缓冲区长度超过%d\n”,BUFFSIZE);
退出(退出失败);
}
}
如果(!*b编号){
printf(“未输入编号。\n”);
printf(“\n输入二进制字节或键入q退出:”;
}否则{
如果(strcmp(b编号,退出)=0){
printf(“再见”);
打破
}
binaryreturn=convertbinary(bnumber);
printf(“二进制数=%d\n”,二进制返回);
printf(“\n输入二进制字节或键入q退出:”;
}
}       
免费(bnumber);
bnumber=NULL;
返回0;
}
int
convertbinary(字符*二进制数){
int-val=0;
而(*binarynumber!='\0'){
val=2*val+(*binarynumber++-'0');
}
返回val;
}

< /代码>做简单的“代码>”(FGET(BNITE,10,STDIN)!=停止)< /C> > >代码>(FGET(BNITE,10,STDIN)& & BNAT[1]=‘Q’)/代码>为您工作。但是当用户输入停止信时,您不应该采取错误退出。我会考虑正常退出,只使用<代码>破解< /代码>。@ Markovnikov没有问题,如果你喜欢这个答案,打勾。
#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;
}