位显示的错误功能
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 -Wextra
、clang -Weverything
、cl /W4
...)。
我已经实现了这个功能来显示一个数字的位(我想看到所有 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 -Wextra
、clang -Weverything
、cl /W4
...)。