【发布时间】:2021-06-07 18:23:51
【问题描述】:
所以这个程序是一个简单的十进制到二进制转换器。
我希望我的代码重复,直到用户按下 ctrl + D。我还想让用户知道,如果他们输入像-2 或1.1 这样的数字,输入的数字不是正整数。
问题是当他们输入float 时,我的代码只会无限打印我的第一个打印语句。
这是我的代码:
void DecToBin(int userInput){
int binary[32];
int i = 0;
while (userInput > 0) {
binary[i] = userInput % 2;
userInput /= 2;
i++;
}
for (int j = i - 1; j >= 0; --j) {
printf("%d", binary[j]);
}
}
int main(void) {
int userDec;
int res;
while(1) {
printf("Please enter a positive whole number (or EOF to quit): ");
res = scanf("%d", &userDec);
res = (int)(res);
if (res == EOF) break;
else {
if (!((userDec > 0) && (userDec % 1 == 0))) {
printf("Sorry, that was not a positive whole number.\n");
}
else {
printf("%d (base-10) is equivalent to ", res);
DecToBin(userDec);
printf(" (base-2)!");
printf("\n");
}
}
}
printf("\n");
return 0;
}
所以当我输入类似11.1 或负值时,它不应该接受它并在终端中打印"Please enter a positive whole number (or EOF to quit)"。
应该接受像11.0 这样的输入。
所以,我要问的是我的代码有什么问题导致它这样做,我应该如何解决它?我应该改用float 吗?
【问题讨论】:
-
userDec % 1 == 0应该测试什么条件?当然除以1总是会留下0的余数。 -
您的 scanf 函数期望得到一个整数,而不是浮点型或双精度型。我假设您对整数输入没有同样的问题。您可能还需要一个单独的函数将小数部分转换为二进制。
-
这是因为
scanf("%d",&userDec);从输入中取出字符,直到找到与格式字符串不匹配的字符。因此,如果您输入12.34,scanf 将获取1和2,然后找到.,但%d格式中不允许使用小数点,因此它会停止使用字符。然后转换12并返回到 scanf 但 scanf 找到的第一个字符是.并且它不能使用它所以它停止。但是你不检查返回码。要修复它,请检查 scanf 的返回码,如果失败,则 f 获取该行的其余部分以收集.34\n,然后再次 scanf。 -
res = (int)(res);- 这是一个完全没用的声明。它打算做什么? -
@Amy
int没有小数部分
标签: c floating-point integer