質問: 高校3年生です。c言語を学んでいます。疑問点があったので質問させていただきます。 現在、実現したい仕様は以下の通りです。 コマンドライン引数から整数を受け取り、ビット演算を用いてその値を2進数として標準出力する。 <実行例(完成したとき)> ``` ./test3 Usage: program ./test3 1 43 00101011 ./test3 2 53018 11001111 00011010 ./test3 4 987654321 00111010 11011110 01101000 10110001 ``` <補足> コマンドラインから出力する長さと2進数出力する整数をうけとる。 出力する長さは1~4byteとする。 出力する長さと2進数出力する整数は、sscanfを用いて変数に代入する。 各bitごとの値を格納する配列bitのサイズは出力する長さから計算し、calloc()を用いて動的確保を行う。 <自分実現できていること> 10進数の値を2進数に変換する関数の作成 ``` void cv2bin(unsigned char n){ int i; for(i=DIGITS-1;i>=0;i--){ printf("%d",(n>>i)&1); } printf("\n"); } int main(int argc,char*argv[]){ if(argc!=3){ printf("Usage: program \n"); exit(1); } unsigned char n; cv2bin(n);//2進数に変換 return 0; } ``` <疑問点> 関数cv2binはきちんとビット演算を用いているといえるでしょうか? コマンドライン引数からの2つの値を'unsigned n'にsscanfを用いて代入するにはどうすればよいでしょうか?
回答: > > 関数cv2binはきちんとビット演算を用いているといえるでしょうか? > > > はい、いえます。ビット右シフト演算`>>`、ビット積演算`&`が使われています。 > > コマンドライン引数からの2つの値を'unsigned n'にsscanfを用いて代入するにはどうすればよいでしょうか? > > > プログラム起動時のコマンドライン引数は、main関数のパラメータ`argv`配列を介してアクセスできます。またこのとき、コマンドライン引数の個数は`argc`で確認できますから、必ず2個以上(もしくはきっかり2個)の引数が指定されたかをチェックしてください。エラーチェックを怠ると、誤ったコマンドライン引数指定でクラッシュする不親切なプログラムになってしまいます。 sscanf書式文字列(`%`+文字のこと)で`unsigned char`型を扱うには、`%hhu`を指定します。ただし、この書式指定は「C99」仕様をサポートするCコンパイラでないと使えません。(お使いのコンパイラ次第です) ``` unsigned char n1, n2; sscanf(argv[1], "%hhu", &n1); sscanf(argv[2], "%hhu", &n2); ``` コンパイラの対応状況がわからなければ、`unsigned int`型と書式文字列`%u`ならばあらゆるC言語コンパイラで動作します。 ``` unsigned int n1, n2; sscanf(argv[1], "%u", &n1); sscanf(argv[2], "%u", &n2); ```