作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个程序,以使用运算符“$”“~”“|”将二进制字符串更改为其他二进制字符串。
但我发现结果很奇怪。
请告诉我为什么结果不同?
int main(int argc, char * argv[])
{
char bstring[sizeof(int) * 8 + 1];
int a, b;
if(argc != 3)
{
printf("Usage: %s binary string 1 binary string 2.\n", argv[0]);
exit(1);
}
a = stoi(argv[1]);
b = stoi(argv[2]);
// printf("%s\n%s\n",itos(~a,bstring),itos(~b,bstring));
// why the result is different with next two statements?
printf("~argument1 %s is %s.\n", argv[1], itos(~a,bstring));
printf("~argument2 %s is %s.\n", argv[2], itos(~b,bstring));
printf("argument1 & argument2 is %s.\n", itos(a & b, bstring));
printf("argument1 | argument2 is %s.\n", itos(a | b, bstring));
printf("argument1 ^ argument2 is %s.\n", itos(a ^ b, bstring));
return 0;
}
int stoi(char *sp)
{
int sum = 0;
while(*sp != '\0')
{
sum = sum * 2 + (*sp++ - '0');
}
return sum;
}
char * itos(int n, char *sp)
{
int i;
static int size = sizeof(int) * 8;
for(i = size - 1; i >=0; i--, n >>= 1)
{
sp[i] = (n & 01) + '0';
}
sp[size] = '\0';
return sp;
}
结果是:
最佳答案
您的 itos
返回传递给它的缓冲区的地址。
由于您将相同的缓冲区传递给此行中的两个 stoi
调用:
printf("%s\n%s\n",itos(~a,bstring),itos(~b,bstring));
第二次调用将覆盖缓冲区内容。 printf
然后打印相同的缓冲区(包含第二次调用写入的内容)两次,因此您将获得两次相同的输出。
如果您将输出拆分为两个不同的 printf
调用,如下所示,它应该可以工作:
printf("%s\n", itos(~a, bstring));
printf("%s\n", itos(~b, bstring));
或者,您可以使用两个不同的缓冲区:
char astring[sizeof(int) * 8 + 1];
char bstring[sizeof(int) * 8 + 1];
printf("%s\n%s\n", itos(~a, astring), itos(~b, bstring));
关于c - 为什么这个C程序会显示这个结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52313938/
我是一名优秀的程序员,十分优秀!