演算子 '$' '〜' '|'を使用してバイナリ文字列を他のバイナリ文字列に変更するプログラムをコーディングしようとしています。
しかし、結果は奇妙だと思います。
結果が異なる理由を教えてください。
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));
2回目の呼び出しでは、バッファの内容が上書きされます。printf
次に、同じバッファ(2番目の呼び出しで書き込まれたコンテンツを含む)を2回出力するため、同じ出力が2回取得されます。
このように出力を2つの異なる呼び出しに分割するprintf
と、次のように機能するはずです。
printf("%s\n", itos(~a, bstring));
printf("%s\n", itos(~b, bstring));
または、2つの異なるバッファを使用することもできます。
char astring[sizeof(int) * 8 + 1];
char bstring[sizeof(int) * 8 + 1];
printf("%s\n%s\n", itos(~a, astring), itos(~b, bstring));
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加