gpt4 book ai didi

c - 为什么这个C程序会显示这个结果?

转载 作者:行者123 更新时间:2023-11-30 18:34:28 26 4
gpt4 key购买 nike

我正在尝试编写一个程序,以使用运算符“$”“~”“|”将二进制字符串更改为其他二进制字符串。

但我发现结果很奇怪。
请告诉我为什么结果不同?

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;
}

结果是:

enter image description here

最佳答案

您的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com