我已经实现了此功能,用于显示数字的位(即使数字可以用2位表示,我也想查看所有9位),但是在显示了2个数字后,它出现了bug,我看到了{ {1}}在位之前。
10
输入:#include <stdio.h>
unsigned long afisare(unsigned long aux1) {
int nrBinar[100], i = 1, j;
while (aux1 != 0) {
nrBinar[i] = aux1 % 2;
aux1 = aux1 / 2;
i++;
}
int marime = 9;
int lipsa = marime - ((i-1) % marime);
if (lipsa != marime) {
while (lipsa != 0) {
nrBinar[i] = 0;
lipsa--;
i++;
}
}
for (j = i - 1; j > 0; j--) {
printf(" %d", nrBinar[j]);
if ((j - 1) % 3 == 0) {
printf("\n");
}
}
//printf("\n");
}
int main() {
unsigned long n, pi, aux;
int tst;
scanf("%ld %ld", &n, &pi);
aux = n;
tst = 0;
printf("%ld", afisare(aux));
while (tst != 1) {
aux = aux | pi;
if (aux == n) {
tst = 1;
printf("Coliziune!");
break;
}
printf("%ld", afisare(aux));
aux = aux & n;
pi = pi >> 3;
}
}
输出:
3 128
等等在我的代码中没有一个0 0 0
0 0 0
0 1 1
10 0 1 0
0 0 0
0 1 1
或类似的东西……
答案 0 :(得分:1)
使afisare()
返回一些内容,例如添加最后一个
return 42;
}
在main()
打印语句中添加换行符并修复转换说明符:
printf("%lu\n", afisare(aux));
还修复了传递给scanf()
的转换说明符:
scanf("%lu %lu", &n, &pi);
要不打印afisare()
的任何结果,请不将其传递给printf()
。
printf("Before call to 'afisare()'\n");
afisare(aux);
printf("After call to 'afisare()'\n");
然后,您也可以将afisare()
设为void
函数(该函数什么也不返回):
void afisare(unsigned long aux1) {
并删除return
语句。
答案 1 :(得分:1)
问题是这一行:printf("%ld", afisare(aux));
您正在调用afisare(aux)
,它输出9位,并且没有return
语句,因此返回值是不确定的。然后,该返回值由printf("%ld", ...)
打印。在一天的这个特定时间,它在您的系统上恰好具有值10
,但它可能是任何东西。这实际上是未定义的行为。
您可以通过不打印返回值来纠正问题:只需使用afisare(aux);
调用该函数即可。
您还应该将afisare
定义为void
函数,因为它不返回任何内容。
打开编译器警告将有助于诊断此类愚蠢的错误(gcc -Wall -Wextra
,clang -Weverything
,cl /W4
...)。