- ベストアンサー
コマンドライン引数を使って2進数を10進数に変換させたい
- C言語を習い始めたばかりで難しいコードが解りません。コマンドラインを使って引数を持たせて動くプログラムを教えていただけませんか。
- 2進数を10進数に変換するプログラムを作成していますが、うまく動作しません。解決策を教えてください。
- C言語のコードを使い、2進数を10進数に変換するプログラムを作成したいのですが、どうすればよいでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
★2進数→10進数の変換は難しいですか? >出来ましたら作成途中のコードをベースに正常に動くプログラムを教えていただければ幸いです。 ↑ ベースにしたくありません。 反面教師的には参考になりますが…。 ・ソースを見たところポインタを使っていませんね。 それから繰り返し処理をすればいいところがNGです。 >この場をお借りして解決の糸口を見つけたいです。宜しくお願いします。 ↑ 過去質問も参考にしてみましたか? http://oshiete1.goo.ne.jp/qa3698732.html→『コマンドライン引数を使って2進数を10進数に変換させたい』 http://oshiete1.goo.ne.jp/qa3690048.html→『8桁の2進数を10進数に変換する方法を教えてください。』 過去のソースコードを見たら全然進んでいないみたいですね。 >(1)このプログラム(8桁の2進数を10進数に変換)をする際は、最後に出力する時(printf)以外は関数を使ってはいけません。 >(2)キーボードから2進数を入力させる。 >(3)空白(ブランク)が入力されても変換可能にする。 >(4)入力された2進数は8桁にし、8桁以上の場合はエラーを出す。 >(5)2進数の「0」と「1」以外の文字が入力された場合はエラーを出す。 >(6)バイナリ変換をし、変換結果を出力する。 ↑ この仕様通りに順番に作り上げればいいですが、何処でつまづいていますか? ポインタを使えば空白(ブランク)のカットが楽になります。 下に私的によりサンプルを載せておきます。 ソースコードを見比べて何処がまずかったのかを補足に書いて下さい。 補足にサンプルの理解度コメントを待っています。 サンプル: #include <ctype.h> #include <stdio.h> // メイン関数 int main( int argc, char *argv[] ) { char *binary; int decimal; int number; int i; // 引数の有無をチェック if ( argc <= 1 ){ printf( "error:8桁の2進数を引数で指定して下さい。\n" ); return 1; } // 8桁2進数の文字列をセット binary = argv[ 1 ]; // 空白を読み飛ばす while ( isspace(*binary) ){ binary++; } // 『0』と『1』のチェック for ( i = 0 ; binary[i] != '\0' ; i++ ){ if ( (binary[i] != '0') && (binary[i] != '1') ){ printf( "error:0と1以外の数字が指定されています。\n" ); return 2; } } // 8桁以上かチェック if ( i > 8 ){ printf( "error:8桁より大きい桁は指定できません。\n" ); return 3; } // 2進数→10進数の変換 decimal = 0; for ( i = 0 ; binary[i] != '\0' ; i++ ){ number = (binary[i] - '0'); // 文字→数値に変換 decimal = (decimal * 2 + number); // 最下位の桁から10進数値を作成 } // 結果の出力 printf( "入力の文字列:%s\n", binary ); printf( "出力の整数値:%d\n", decimal ); return 0; } 以上。
その他の回答 (2)
- Werner
- ベストアンサー率53% (395/735)
○明らかにおかしいところ > //「0」と「1」のループ > for( i=0; i<decimal[i]; i++ ){ forループの継続条件がおかしい。 (i番目の文字の文字コードとiを比較してどうする?) > if(( decimal[ n ] == '0' ) || ( decimal[ n ] == '1' )){ //「0」または「1」の判断 直前で decimal[ n ]='\0'; としてるからdecimal[ n ]が'0'や'1'と一致することは絶対にない。 > //桁数のループ > int m = 0; > for( i=0; i<'\0'; i++ ){ > m = m +1 ; > } 継続条件が意味不明。 '\0'==0なのでループは一回も回らず mは結局0のまま。 ○間違いとは言い切れないが気持ち悪いところ > char decimal[ 128 ], binary[ 128 ]; decimalには一度も「10進数表記された文字列」は格納されていないのに、 decimalという変数名なのは違和感がある。 > //decimal[0]~decimal[7]の判断 ループ使って書く気はない? 8桁限定なのもどうにかしたい。 > return 1; 正常終了の時は普通0をreturnする。 ○もっと楽できるところ(自力で全処理を書くのが目的だったら無視してください。) > for( i=0; argv[1][i] != '\0'; i++ ){ > binary[i] = argv[1][i]; > } > binary[i] = '\0'; 文字列のコピーはstrcpyでできる。 (文字列を書き換える気がないなら、charポインタの代入だけして参照しても良い) >//桁数の判断 文字列の長さはstrlenで調べられる。 以下は試しに書いてみたサンプル。 (そのコードをベースにする気は無かったからほぼ別物ですが。) ----------------------------------------------------------- /*全角空白は削除してください*/ #include<stdio.h> int main(int argc, char *argv[]) { int number=0; char *binary; if( argc > 1 ){ binary = argv[1]; } else{ printf("2進数を入力してください。\n"); return 1; } //2進数表記文字列->数値 //自力でやる必要がないならstrtolでも使えばいい for(; *binary != '\0'; binary++){ if(*binary != '0' && *binary != '1'){ //0,1以外の文字は無視して次へ continue; } number*=2; if(*binary == '1'){ number++; } } printf("2進数を10進数に変換した値は %d \n",number); return 0; }
- redfox63
- ベストアンサー率71% (1325/1856)
空白チェックと『0』『1』チェックのループの終了条件がおかしいですよね 質問する際に実行手順と実行結果、期待する結果を投稿したほうがいいですよ ついでに ソースをアップするなら 字下げなどをして少しでも見やすいソースにしましょう このサイトの場合行頭からの半角スペースは削除されますので全角スペースなど対処しましょう iはループカウンタです deciaml[i]やbinary[i]は'0'または'1'です iは0からカウントアップされますが decimalやbinaryも文字終端では止まりません i<decimal[i] だと iがdecimal配列のi番目の要素未満ならループ続行となります したがって decimal[i]が'0'なら iが48(0x30)未満なら続行になります これは意図した動きですか