以下のようなコードを書きました。
4つの文字列の組み合わせを全列挙するだけのものです。
ネット上のサンプルと比較しても綺麗なコードではないですが、とりあえず自分で書いてみました。
しかし、何もプリントできません。
基本的な間違いをしている気がしますが何がおかしいのでしょうか。
***の部分をコメントアウトすると、ABCDの文字列が列挙されますので、シフト演算の作法が間違っているのではないかと思うのですが。
C
1#include<stdio.h> 2#include <string.h> 3int main(void){ 4 char a[4] = "ABCD"; 5 char b[4]; 6 int i, j, k, m; 7 for(i = 0; i < 16; i++){ 8 k = 0; 9 memset(b, '\0', sizeof(b)); 10 for(j = 0; j < 4; j++){ 11 if(i & (1 << j)){ // *** 12 b[k] = a[j]; 13 k++; 14 } // *** 15 } 16 for(m = 0; m < 4; m++){ 17 printf("%c", b[m]); 18 } 19 printf("\n"); 20 } 21 return 0; 22}
実行するとどういう出力がされるのか提示しよう
分かりにくくてすみませんでした。***部分をコメントアウトしないと、何も表示されません。4つの文字の組み合わせ16パターンを表示したかったのですが、配列bには何も格納されないような動きにみえます。
> 何も表示されません
こちらで実行したら何かしらは表示されています。
僕とこではこんなの↓出たよ?
1-0D
1-1C
3-01-1DC
1-2B
5-01-2DB
3-11-2CB
7-03-11-2DCB
1-3A
9-01-3DA
5-11-3CA
11-05-11-3DCA
3-21-3BA
13-03-21-3DBA
7-13-21-3CBA
15-07-13-21-3DCBA
paiza ioで実行した場合もepistemeさんの結果と同じですね。
https://paiza.io/projects/Mo0Q-d_NswIg_9GZzU24ow
質問者さんの実行環境を追記いただいても良いですか?
面白い(?)ことにWSL/Ubuntu上で試したところ "1-0D"で表示が停まってしまいました。コードを追ってはいないですが、何か変ですね。
$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc -Wall t1.c
$ ./a.out
1-0D
$ ^C
$
デバッグのためのprintf関数を残してしまいました。おかしな出力で申し訳ありません。
整理したコードを再掲しました。
また、web上のcodepadで実行してみたら、意図した通りの結果が出ました。私の環境はvscodeで、拡張機能のcode runnerで出力しようとして失敗しています。
再掲のコードには全角スペースが入っています。
また、'\0' を出力するとへんなことになるのかもしれないので、
memset(b, '\0', sizeof(b)); を memset(b, ' ', sizeof(b)); に変更してみてください。
'\0' をスペースにするということです。
回答4件
あなたの回答
tips
プレビュー