错误的功能,可显示

时间:2018-10-13 11:50:34

标签: c printing bit

我已经实现了此功能,用于显示数字的位(即使数字可以用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 或类似的东西……

2 个答案:

答案 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 -Wextraclang -Weverythingcl /W4 ...)。