gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:32:48 25 4
gpt4 key购买 nike

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

最佳答案

正如其他人所说,您需要将字符串与 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 作为标题之一。不需要该 header ,因为您没有使用它的任何功能。

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

代码如下:

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

关于C:while循环退出条件,使用fgets进行输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41112659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com