我试图编写一个C程序,它将计算用户选择和输入的整数的任何二进制表示中的所有1的数量。然后我要打印总数为1。但首先,我必须检查以确保输入的数字是整数。我的代码:
#include <stdio.h>
int main() {
int num;
int count;
float input;
printf("Please enter an integer: ");
scanf("%f", &input);
num = (int)input;
if (num == input) {
while (num > 0) {
count += num & 1;
num >>= 1;
printf("%d", &count);
}
} else {
printf("Warning: this is not a valid integer.");
}
return 0;
}
当我运行代码时,我能够输入我选择的整数,但之后我会得到一个输出:134148802013414880201341488020
或类似的东西。我最近才开始用C编码,所以我不确定这意味着什么或我的代码出错了。
答案 0 :(得分:2)
您的代码存在问题:
float
,对于大于23位的数字,您的精度会有所下降。count
未初始化。即使只是增加它也有不确定的行为。printf("%d\n", count);
打印位数。您目前使用此类型的无效转化说明符打印count
的地址。以下是更正后的版本:
#include <stdio.h>
int main(void) {
unsigned int num;
printf("Please enter an integer: ");
if (scanf("%u", &num) == 1) {
int count = 0;
while (num > 0) {
count += num & 1;
num >>= 1;
}
printf("%d\n", count);
} else {
printf("Warning: this is not a valid integer\n");
}
return 0;
}
注意:
UINT_MAX
以下的数字,在当前系统上通常为4294967295
。较大的数字将以实现定义的方式处理。答案 1 :(得分:1)
您的count
变量未初始化,因此它可以从随机 1 的任何值开始。始终初始化变量:
int count = 0;
然后当你打印它时,你打印错误的东西 - 一个指向计数而不是计数本身的指针,并且没有回车,所以你把它全部放在一条线上:如果数字是正确的,你会得到一个单期“12345”或“11122234445”。
printf("Count is now is %d\n", count);
我强烈建议你打开来自编译器的所有警告 - 这会警告你一个未初始化的变量,几乎可以肯定的是%d和它之间的差异(也许你错过的事实包括printf
)
1 反过来说,在某些受控制的开发环境中,内存已归零,您不会看到任何错误。然后你就可以参加制作了。该程序将在性能优化的环境中运行,其中内存清零不值得麻烦。 并且该程序将始终失败。从你开始,你不想养成坏习惯。