• ベストアンサー

【C】引数の変換をする場合どちらの方法を使うべきでしょうか?

int main(int argc, char* argv[]) { int i; /* argv[1]をintになおして格納用 */ 処理 } という感じでメインを作ると思いますが 引数のargv[0]はファイルの絶対パス argv[1]には"必ず"数字(整数)が入っていると仮定して argv[1]をint型に変換する場合 (1) sscanf(argv[1], "%d", &i); とするか (2) stdlib.hをインクルードして i = atoi(argv[1]); とするかの二通りをとりあえず思いついたのですが どちらもintに変換された値が入るわけですが C言語になれておられる方なら普通どちらをつかいますか? (1)or(2) 又はそれ以外の方法、どっちでも良し、場合によるetc... ご意見よろしくお願いします。

  • yksin
  • お礼率94% (69/73)

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

sscanfは今回のような単純な処理を行うにはオー場スペックです。 atoiは古い関数なので、可能な限り使うべきではありません。理由は、オーバーフロー等のエラーが発生しても検出できなかったり、数字以外が現れて途中で解析が中断されてもわからないからです。 というわけで、今回の場合はstrtolを使うのが妥当です。符号なしの場合はstrtoulです。strtolならエラーチェックができますし、16進数や8進数が混在していても解析することができます。

yksin
質問者

お礼

ありがとうございます strtolというのもあるのですね、エラー検出や基数指定をする場合にはこちらを使う方が良いようです。 今回は一応必ず数字が入っているという条件をつけてみたのでエラーはないという前提だってわけですが、実際ではエラーチェックしないわけないですしatoiは極力使わない方が良いのかもしれませんね。 参考にさせていただきます。

その他の回答 (3)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

私もatoiですね。 sscanfだと、その関数呼び出しが何をやっているのか書式指定文字列を見るまで分かりませんが、atoiであれば「atoi」という文字を見た時点で分かるので、分かりやすさが違います。

yksin
質問者

お礼

ありがとうございます。 やはり皆さんatoiですね。 >atoiであれば「atoi」という文字を見た時点で分かるので、分かりやすさが違います。 確かにそのとおりですね。 参考にさせていただきます。

回答No.2

atoiをオススメします。 atoiの方が『直感的に分かり易い』です。 コードは書く時よりも、見た時に分かりやすい方を選択する事をオススメします。(コメント書けば同じなんですが;) (sscanfなんて、はじめて見ましたよw)

yksin
質問者

お礼

ありがとうございます >sscanfなんて、はじめて見ましたよ atoiがあるのにわざわざsscanfですることもないんですが同時に思いついたのがこの二つだったわけでatoiと比べる相手になったわけです。 >コードは書く時よりも、見た時に分かりやすい方を選択する事をオススメします 確かにそうですね、修正の際等で見難いのは良くないですね。 参考にさせていただきます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

別にどっちでもいいと思いますけど、 私だったら、atoiかな 機能として、sscanfまでいらないし、atoiで充分かと

yksin
質問者

お礼

ありがとうございます たしかにsscanfとatoiではatoiのほうが手軽ですよね。 参考にさせていただきます。

関連するQ&A

  • コマンドラインから引数を渡したいのですが・・・

    VC.NETで参考書に載っていた下のようなコードを書きました。 #include <iostream> #include <cstdlib> using namespace std; int main (int argc, char *argv[]) { int sum; if (argc != 3) { cout << "引数の個数が違います。"; return 1; } sum = atoi (argv[1]) + atoi (argv[2]); cout << "合計=" << sum << '\n'; return 0; } しかしながら、引数の個数が違います。としか出力されません。どうすればよろしいでしょうか?

  • 全くわかりません。

    C言語の課題が全くわかりません。 (1)~(5)には何が入りますか? 丸投げですいません。後でじっくり考えます。 お願いします。 コマンド行引数に整数と符号(+、ー)を指定し、 その和を表示するプログラム。 例%calc -5+10+100-10=95と表示するプログラム #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { int sum=0,i=1; if(argc(1)1) put("komanasi"); else if(argv[i],(2)=='+'){ i++; sum += atoi(argv[i(3)]); }else if (argv[i],(2)=='-'){ i++; sum-=atoi(argv[i(3)]); }else sum+=atoi(argv[i(3)]); while((4)<(5)){ if(argv[i],(2)=='+'){ i++; sum+=atoi(argv[i(3)]); }else{ i++; sum-=atoi(argv[i(3)]); } } printf("%d\n",sum); return(0); }

  • main( )

    次の様なプログラムを作りました。 Dosプロンプトを開き、コンパイルで出来た、exeファイルのアドレスを渡しました。 例えば、2と3を引数として渡す時、 2 スペースを押す、 3 enter  の順に行うと、エラーになります。 どの様に、引数を渡すのか操作方法を教えてください。 お願いします。 #include<stdlib.h> #include<stdio.h> int main(int argc, char *argv[]) {    if(argc!=3){     printf("2つの数を指定してください。");     exit(1);    }     printf("%f",atoi(argv[1])+atoi(argv[2]));    return 0; }

  • コマンドライン引数

    コマンドライン引数で以下のようなプログラムを実行したいのですが どうしたらいいのか分かりません!! みなさんの意見を聞かせてください(lll´Д`lll)    □☆□□□☆□□□☆□□□☆□    ☆★☆☆☆★☆☆☆★☆☆☆★☆    □☆□□□☆□□□☆□□□☆□    □☆□□□☆□□□☆□□□☆□    ☆★☆☆☆★☆☆☆★☆☆☆★☆    □☆□□□☆□□□☆□□□☆□    □☆□□□☆□□□☆□□□☆□    ☆★☆☆☆★☆☆☆★☆☆☆★☆    □☆□□□☆□□□☆□□□☆□    □☆□□□☆□□□☆□□□☆□ プログラムは途中まで作ったのですが、肝心なとこは 全く分りませんっっ #include <stdio.h> int main(int argc, char *argv[]) { int yoko, tate, i, j; if( argc < 3 ) return(1); sscanf( argv[1], "%d", &yoko ); sscanf( argv[2], "%d", &tate ); for( j = 0; j < tate; j++ ) { printf("\n"); } return(0); } /* end of pat2.c */

  • C言語で分からないところがあるのですが・・・

    すみません。C言語で分からないところがあったので来ました。 ユーザから数字を任意の数だけ受け取って、その数字とその和を表示するプログラムです。atoiなる関数、そしてコマンドライン引数というのを使って考えてみた結果を下に書きましたので、どなたか修正してください。お願いします。 実行結果(のイメージ図) 20 39 4 sum 20 39 4 63 途中までのソースコードです。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc,char *argv[]) { int sum; int n,i; printf("How many numbers INPUT?: "); scanf("%d", &n); for(i = 0; i <= n; i++){ atoi(argv[i]); } sum = printf("%d",sum); return 0; }

  • C言語でコマンドラインの引数について。

    コマンドラインで引数をわたす基本的なプログラムは main(int argc,char *argv[]){....] ですよね。 今回実行時に、 >実行ファイル名 123 + 233 といれたら、123+233を計算してくれるプログラムを作ろうとしています。 その場合、main(int argc,int *argv[]){} としたら、argv[1]に123が入って、argv[2]に+が入って、argv[3]に233が、入るというわけではないんでしょうか? とりあえず、確認で #include<stdio.h> main(int argc,int *argv[]) { printf("%d\n%d\n",argv[1],argv[3]); } としてみたんですが、実行結果は、とても長い数字がでてきてきました。 なにがいけないのか教えてください。 お願いします。 あとWindows MEでVC++6を使ってます。

  • MacでC言語を勉強してみてるのですが

    最近C言語に興味を持って 趣味程度に、ハーバート・シルトさん著の「独習C」を、 Xcodeを使ってCが使える感じにして、 プログラミングを打って、ビルドして、コンソールで結果を見て、ふむふむ、ってやっていたのですが、 7章の4節でコマンドライン引数というものが出てきて、 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i; double d; long l; i = atoi(argv[1]); l = atol(argv[2]); d = atof(argv[3]); printf("%d %ld %f", i, l, d); return 0; } という例題のプログラムの結果を見たいのですが、コマンドラインというものがどうすればXcodeで見られるのかよくわかりません。 ぜひ助けてください。コンソールには出ないんですよね・・・?

    • ベストアンサー
    • Mac
  • コマンドプロンプトを使用してのコマンドライン引数

    winXPのコマンドプロンプトを利用して 参考書「独習C」を使い、C言語の学習をしています。 その本の7.4の項目~main()の引数~で main(int argc,char *avgv[])を利用すると コマンドラインから引数をとることができるとありますが 私の学習環境ではうまくいきません。 具体的には #include <stdio.h> int main(int argc, char *argv[]) { int i; for(i=1; i<argc; i++) printf("%s ", argv[i]); return 0; } というプログラムを実行しても何も表示されません。 どうすればコマンドライン引数を利用できますか?

  • プログラミング(argcとargv)

    入力された数の合計とその計算式を表示するプログラムをつくっています。惜しい(?)ところまでいったのですがその先がなかなか進みません。以下のプログラムのどこを修正したらよいでしょうか?教えてください。 #include <stdio.h> #include <stdlib.h> #define nMAX 10 int main(int argc, char **argv){ int sum = 0; if(argc < 2){ printf("Too few option!\n"); return 1; } int i, n; for(i = 1; i < argc; i++){ n = atoi(argv[i]); sum = sum + n; } printf("%d\n", sum); }

  • 引数の渡し方と受け方(argv)

    メインで引数をもらい、それをパラメタチェック関数に 渡す場合、どのような形で渡せばいいですか? ※メインでargvを変数に格納しないで、 そのままargvを関数に渡す方法が分かりません。 int prm_chk(char *argv[]) { /* 処理省略 */ } int main (int argc, char *argv[]) { /* 処理省略 */ /* 以下のパラメタ(argv)の渡し方 */ if(prm_chk(*argv[]) != 0){ exit(-1); } exit(0); }

専門家に質問してみよう