我正在开发一个将二进制转换为十进制的程序,用户输入原始数字或按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;
}
答案 0 :(得分:2)
正如其他人所说,您需要将字符串与strcmp
进行比较,而不是!=
,因为这在C中不正确。
我还建议检查来自malloc
的void*
指针的返回值,因为这是在堆上为动态数组分配空间时的好习惯。
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;
}