位显示的错误功能

Bugged function for bits showing

我已经实现了这个功能来显示一个数字的位(我想看到所有 9 位,即使这个数字可以用 2 位表示),但是在显示 2 个数字后,它被窃听了,我明白了位前的 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

等我的代码中没有一个 10 或类似的东西...

制作 afisare() return 东西,例如添加一个 final

  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 函数(一个 return 什么都没有的函数):

void afisare(unsigned long aux1) {

并删除 return 语句。

问题出在这一行:printf("%ld", afisare(aux));

您正在调用 afisare(aux),它打印 9 位,并且没有 return 语句,因此 return 值不确定。 return 值然后由 printf("%ld", ...) 打印。它恰好在一天中的这个特定时间在您的系统上具有值 10,但它可以是任何值。它实际上是未定义的行为

您可以通过 而不是 打印 return 值来更正问题:只需使用 afisare(aux);.

调用该函数

您还应该将 afisare 定义为 void 函数,因为它不会 return 任何东西。

打开编译器警告将有助于诊断此类愚蠢的错误(gcc -Wall -Wextraclang -Weverythingcl /W4...)。