痔になりやすい生活習慣とは?

#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
char gyou[1024];
int gyousuu = 0;
if ( argc < 2 ){
printf("file mei ga nai\n");
return -1;
}
fp = fopen(argv[1], "r");
if ( fp == NULL ){
printf("fopen dekinai\n");
return -2;
}
while(fgets(gyou, sizeof(gyou), fp) != NULL){
gyousuu++;
}
fclose(fp);
printf("gyousuu=%d\n", gyousuu);
return 0;
}
 
 以上のプログラムはご覧のとおり、「ファイルの行数を計算」のプログラムです。

さて以上の
 if ( argc < 2 ){
printf("file mei ga nai\n");
return -1;
}
は「コマンドライン引数チェック」を行っています。・・・
 if ( argc < 2 ){の「argcは2以上である必要がある」と参考書に書いてあります。
 
以上ですが意味が日光手前ですが、プログラムの行数をカウントするうえで、
 「コマンドライン引数チェック」とはどんな作業を行っているとこなのでしょうか!?
 よろしくお願いします。
 

このQ&Aに関連する最新のQ&A

A 回答 (3件)

例えばプログラム名をhogeとした場合



hoge と起動した場合
argc = 1
argv[0] = "hoge"

hoge aaa bbb の様に起動した場合
argc = 3
argv[0] = "hoge"
argv[1] = "aaa"
argv[2] = "bbb"
↑の値が各変数にセットされます。
以後の処理で、それらの値を使用するのが
必須の場合、引数をつけずにプログラムを
起動したか、値が適切な物であるかどうか
を「コマンドライン引数チェック」で確認
してチェック結果に応じた処理をします。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
 まだ理解は無理みたいですので
再度参考書の数十ページに戻り見直しておりす。

お礼日時:2015/01/26 20:04

コマンドラインから実行した時に渡したパラメータの数をチェックしています。


http://www9.plala.or.jp/sgwr-t/c/sec11-4.html
    • good
    • 0

これの意味がわからないとすると、Cを全く知らないレベルでしょうか?


「コマンドライン」とか「引数」の言葉の意味はわかるのでしょうか?一応、わかると仮定して説明すると、処理内容は、

もし「コマンドラインの引数の数がコマンド名も入れて2未満なら」、言い換えると引数が無ければ、
file mei ga nai と表示して、プログラムをリターンコード -1 で終了する

です。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qコマンドライン引数について。

コマンドライン引数についての質問です。

コマンドライン引数に適当な数字をいれ、金種別にわけるプログラムですが、
コマンドライン引数に負の値や、文字列を入力したときにはエラーが表示させるようにしているのですが、
数字と文字を混合したもののときはエラーが表示されずにそのまま処理されてしまいます。

初めの一文字目が数字だったらそのあとに文字を入れても実行されてしまうようです。

全て数字の場合のみ実行させてそれ以外はエラーメッセージを表示させたいのですが、どのようにすればいいでしょうか?


#include <stdio.h>
#include <stdlib.h>

int syubetu(int money,int *kinsyu);
int *kinsyu;

int main(int argc,char *argv[])
{
int *p,a;

p=(int*)malloc(sizeof(int)*9);
if(p==NULL){
printf("メモリ確保失敗\n");
exit(1);
}

a=atoi(argv[1]);

if(a>0){
syubetu(a,&p[0]);
printf("1万円 %d枚\n",p[0]);
printf("5千円 %d枚\n",p[1]);
printf(" 千円 %d枚\n",p[2]);
printf("5百円 %d枚\n",p[3]);
printf(" 百円 %d枚\n",p[4]);
printf("50円 %d枚\n",p[5]);
printf("10円 %d枚\n",p[6]);
printf(" 5円 %d枚\n",p[7]);
printf(" 1円 %d枚\n",p[8]);
}
else{
printf("入力エラー\n");
exit(1);
}
}
int syubetu(int money,int *kinsyu)
800字以上になるため、処理は省略します。

コマンドライン引数についての質問です。

コマンドライン引数に適当な数字をいれ、金種別にわけるプログラムですが、
コマンドライン引数に負の値や、文字列を入力したときにはエラーが表示させるようにしているのですが、
数字と文字を混合したもののときはエラーが表示されずにそのまま処理されてしまいます。

初めの一文字目が数字だったらそのあとに文字を入れても実行されてしまうようです。

全て数字の場合のみ実行させてそれ以外はエラーメッセージを表示させたいのですが、どのようにすればい...続きを読む

Aベストアンサー

#3です。

>それを試したのですが、期待通りの結果になりませんでした。
>う~ん、なぜでしょう。
失礼! タイプミスがあったようです。
以下をコンパイル、実行してみてください。

#include <stdio.h>
#include <stdlib.h>

int isnumstr(char *s)
{
int c;
while(c=*s++){
if((c<'0') || ('9'<c))
return(0);
}
return(1);
}


void main(int argc, char *argv[])
{
int num;
if(argc < 2) {
printf("No args!\n");
exit(1);
}

num = atoi(argv[1]);
printf("argv[1]=[%s], num=[%d]\n", argv[1], num);
if(isnumstr(argv[1]))
printf(" OK!\n");
else
printf(" NG!\n");
}

#3です。

>それを試したのですが、期待通りの結果になりませんでした。
>う~ん、なぜでしょう。
失礼! タイプミスがあったようです。
以下をコンパイル、実行してみてください。

#include <stdio.h>
#include <stdlib.h>

int isnumstr(char *s)
{
int c;
while(c=*s++){
if((c<'0') || ('9'<c))
return(0);
}
return(1);
}


void main(int argc, char *argv[])
{
int num;
if(argc < 2) {
printf("No args!\n");
exit(1);
}

num = atoi(argv[1]);
printf("argv[1...続きを読む

Qセグメンテーション違反

C言語を使用しています。

構造体に値をいれようとしたら、コンパイルは出来るのですが、実行時に
「セグメンテーション違反です (core dumped)」
となってしまい、それ以上行えません。

構造体と代入したい変数との型は、合っています。

いろいろ本などで見ましたが、何が原因かわからず困っています。
教えてください。
宜しくお願いします。

Aベストアンサー

OSは何でしょうか。コンパイラは何を使用していますか?
通常、デバッグオプションをつけて実行すると、異常の発生したソースの箇所で止まりますので、それが手がかりになります。またNo1の方が言われてますように、ソースが公開できるのであれば、ソースを提示するのが良いかと思います。

Q#defineの定数を文字列として読み込む

#define A "xxx"
#define B "yyy"
と定義しておいて

scanf("%s", str)
で読み込んだ文字列strが
"xxx"だった場合、"yyy"だった場合のように分岐したいのですが
このとき

if(str == "xxx")
のように中身を指定するのではなく

if(str == AA)
のように定数で分岐させることってできますか?

上記のままではできませんが、何か特別な関数とかでできるのでしょうか?

Aベストアンサー

こんにちは。

やりたいことの解釈ですが、(※勘違いの場合はすみません。)

1)マクロの名前(定義名)が文字列として格納された文字列 str があるとする。
 例)
   #define A "xxx"  //マクロ名=A
   char str[] = "A";   //"A"はマクロ名

2)上記の文字列 str を関数 func に渡す際に、マクロ名ではなくそのマクロで
  定義された文字列を渡したい。
 例)
   func( str );    //←この場合
    ↓
   func( "xxx" );  //←として展開される

ということで宜しいでしょうか?

だとした場合、少し回りくどいやり方かもしれませんが、以下のような文字列
変換用のマクロを定義してみては如何でしょうか?
※基本的には、他の回答者の方と同じように strcmp関数 を使用します。

■マクロ例
==============================
//文字列を定義したマクロ …※1
#define A "xxx"
#define B "yyy"

//引数を文字列として取得するマクロ
#define GETSTR(x) #x

//引数をマクロ名としてそのマクロで定義された文字列を取得するマクロ …※2
//注)<string.h>がインクルードされていることを前提とする
#define STR2MAC(str) \
!strcmp(str,GETSTR(A))? A : \
!strcmp(str,GETSTR(B))? B : str
==============================

上記マクロを使用して、関数 func にマクロ名が格納された文字列 str を
渡す場合は、
   func( STR2MAC( str ) );
のような記述になります。

前提として、※2のマクロ内でstrcmp関数を用いて文字列の照合を行って
いますので、<string.h>のインクルードが必要になります。

また、※1の文字列を定義するマクロの種類(パターン)を増やす場合、
※2のマクロの判定文もそれに合わせて増やす必要があります。

上記のマクロを使用したサンプルソースを下記に掲載致します。
注)エラー処理は行っていません。

■サンプルソース
==============================
#include <stdio.h>
#include <string.h>

//文字列を定義したマクロ
#define A "xxx"
#define B "yyy"

//引数を文字列として取得するマクロ
#define GETSTR(x) #x

//引数をマクロ名としてそのマクロで定義された文字列を取得するマクロ
//注)<string.h>がインクルードされていることを前提とする
#define STR2MAC(str) \
!strcmp(str,GETSTR(A))? A : \
!strcmp(str,GETSTR(B))? B : str

//プロトタイプ
void funcHoge( const char *str );

int main(void)
{
char sArg[128];

printf( "A or B ?>" );
scanf( "%s", sArg );

printf( "string1: %s\n", sArg );
funcHoge( STR2MAC(sArg) );

return 0;
}

void funcHoge( const char *str )
{
printf( "string2: %s\n", str );
}
==============================

■上記サンプルの実行結果
≫実行その1≪
A or B ?>A
string1: A
string2: xxx

≫実行その2≪
A or B ?>B
string1: B
string2: yyy

≫実行その3≪
A or B ?>hoge
string1: hoge
string2: hoge

以上です。

こんにちは。

やりたいことの解釈ですが、(※勘違いの場合はすみません。)

1)マクロの名前(定義名)が文字列として格納された文字列 str があるとする。
 例)
   #define A "xxx"  //マクロ名=A
   char str[] = "A";   //"A"はマクロ名

2)上記の文字列 str を関数 func に渡す際に、マクロ名ではなくそのマクロで
  定義された文字列を渡したい。
 例)
   func( str );    //←この場合
    ↓
   func( "xxx" );  //←として展開される

ということで宜しいでしょう...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qコマンドラインに入力されている文字列の1文字を出力

○下記のコードについての質問になります

#include <stdio.h>

int main(
intargc,/*コマンドライン引数*/
char*argv[]/*コマンドライン*/
)
{
int counter;/*ループカウンタ*/

for( counter = 0 ; counter < argc ; counter++)
{
printf( "argv[%d]:%s\n" , counter , argv[counter] );
}
/*-----------------------------------------------------------
printf( "コマンドラインの1文字を抜き取る:%c" , ????????);
------------------------------------------------------------*/

return (0);
}

○質問
コマンドラインのプログラムになります。
「--」で囲っている部分になりますが、
コマンドラインに入力されている文字列の1文字だけを出力できるように
したいのですが、どうすればこれを実現することができるのでしょうか??
一例として

>command.exe orange ringe
^^^^^^

と、コマンドを打ったときに、「^^」の部分になりますが、
orangeの「a」だけを出力させたい場合を、知りたいと思っております。

以上、宜しくお願いします。

○下記のコードについての質問になります

#include <stdio.h>

int main(
intargc,/*コマンドライン引数*/
char*argv[]/*コマンドライン*/
)
{
int counter;/*ループカウンタ*/

for( counter = 0 ; counter < argc ; counter++)
{
printf( "argv[%d]:%s\n" , counter , argv[counter] );
}
/*-----------------------------------------------------------
printf( "コマンドラインの1文字を抜き取る:%c" , ????????);
------------------------------------------------------------*/

retu...続きを読む

Aベストアンサー

★コマンドラインの引数と文字列について
・『command.exe orange ringe』という2つの引数が与えられたとき
 (1)argv[0]…"command.exe"
 (2)argv[1]…"orange"
 (3)argv[2]…"ringe"
 (4)argv[3]…NULL
 となります。なお、argv[0]は処理系によっては、起動パス名などが空になる場合があります。注意!
・1つの引数から1文字の取得(argv[1] が "orange" の場合)
 (1)argv[1][0]…'o'
 (2)argv[1][1]…'r'
 (3)argv[1][2]…'a'
 (4)argv[1][3]…'n'
 (5)argv[1][4]…'g'
 (6)argv[1][5]…'e'
 (7)argv[1][6]…'\0'
 となります。これは main() 関数の定義で『char *argv[]』となっているため、ポインタへの配列は
 2次配列と同じような要領でアクセス(取得・設定)が可能です。

本題:
・上記のことから『orange』の『a』は argv[1][2] で取り出せます。→『*(argv[1] + 2)』でも可能。
 for 文と添え字のカウンタ変数を2つ使えば1文字ずつの出力が出来ます。
 『argv[counter][i]』という感じになります。
・以上。おわり。→上記のを参考に for 文の部分は KGM さんが記述して下さい。

★コマンドラインの引数と文字列について
・『command.exe orange ringe』という2つの引数が与えられたとき
 (1)argv[0]…"command.exe"
 (2)argv[1]…"orange"
 (3)argv[2]…"ringe"
 (4)argv[3]…NULL
 となります。なお、argv[0]は処理系によっては、起動パス名などが空になる場合があります。注意!
・1つの引数から1文字の取得(argv[1] が "orange" の場合)
 (1)argv[1][0]…'o'
 (2)argv[1][1]…'r'
 (3)argv[1][2]…'a'
 (4)argv[1][3]…'n'
 (5)argv[1][4]…'g'
 (6)argv[1][5]…'e'
 (...続きを読む

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

QC言語で文字列をかえす正しい書き方が知りたいです?

C言語で次の警告が表示されます。
文字列を返したいのですが、正しい書き方はどのようにすれば良いのでしょうか?


jci.h(20) : warning C4172; ローカル変数またはテンポラリのアドレスを返します。


char *test(char *a, int b)
{
char str[BUFSIZ];
return str; <------

}

Aベストアンサー

再入可能にするかどうかで、回答は変わります。

A.2度呼び出した場合に前のデータを破壊してもよいケース(再入不可能)

char *test(...)
{
static char str[BUFSIZ]; // static指定でメモリは静的に確保されます。

...

return str;
}

B.2度呼び出した場合に前のデータを破壊しないケース(再入可能)
B-1.mallocを使ってもいいケース
char *test(...)
{
char *str;
str = malloc(BUFSIZ);
if(str == NULL) return NULL; // エラー

...

return str;
}
この場合は、呼び出し元でちゃんとfreeしましょう。

B-2.呼び出し元でメモリを確保するケース
(注意:同じアドレスを指定して複数回呼び出すと、メモリ内容は当然破壊されます)
char *test(char *str, ...)
{

...

return str;
}
これは#1の方の回答と同じです。

B-3.B-1/B-2の複合
(注意:NULL以外の同じアドレスを指定して複数回呼び出すと、メモリ内容は当然破壊されます)
char *test(char *str, ...)
{
if(str == NULL)
{
str = malloc(BUFSIZ);
if(str == NULL) return NULL; //エラー
}

...

return str;
}

こんなところですかね。

再入可能にするかどうかで、回答は変わります。

A.2度呼び出した場合に前のデータを破壊してもよいケース(再入不可能)

char *test(...)
{
static char str[BUFSIZ]; // static指定でメモリは静的に確保されます。

...

return str;
}

B.2度呼び出した場合に前のデータを破壊しないケース(再入可能)
B-1.mallocを使ってもいいケース
char *test(...)
{
char *str;
str = malloc(BUFSIZ);
if(str == NULL) return NULL; // エラー

...

return str;
}
この場合は、呼び...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qコマンドライン引数のチェック

args[]ってString型の配列変数ですよね?

たとえば、
コマンドライン引数で数字を受け取って演算するために
Stringからint等の数値に変換するとします。

Integer.ParseInt()を使うと、もし数字ではない引数
だったときに例外処理が発生します。
事前に文字か数字がチェックする方法はあるのでしょうか?

それとも例外処理で対応するしかないのでしょうか?

Aベストアンサー

>StringクラスのcharAt()で取り出してから、それをCharacter
>クラスのクラスメソッドisDigit()で数値かどうか調べる
>という方の具体的なコーディング例などありますか?

本当ならば、メソッドを作った方が良いのかもしれませんが、
コマンドライン引数と云う事なので敢えてしません。

public static void main(String[] args){
  if(args.length > 0){
    boolean flag=true;
    for(int i=0 ; i<args[0].length() ; i++){
      flag=Character.isDigit(args[0].charAt(i));
      if(flag){
        continue;
      else {
        break;
      }
    }
    if(flag){
      Integer.parsInt(args[0]);
    else {
      // 整数置き換え不可の場合の処理
    }
  }
  else {
    // 引数無しの場合の処理
  }
}

適当ですが、こういう感じです。
これを、例外処理で置き換えると、

public static void main(String[] args){
  try {
    Integer.parseInt(args[0]);
  }
  catch(ArrayIndexOutOfBoundsException e1){
    // 引数無しの場合の処理
  }
  catch(NumberFormatException e2){
    // 整数置き換え不可の場合の処理
  }
}

と、かなり簡潔に記述する事が出来ます。
私ならば後者を取りますね。

>StringクラスのcharAt()で取り出してから、それをCharacter
>クラスのクラスメソッドisDigit()で数値かどうか調べる
>という方の具体的なコーディング例などありますか?

本当ならば、メソッドを作った方が良いのかもしれませんが、
コマンドライン引数と云う事なので敢えてしません。

public static void main(String[] args){
  if(args.length > 0){
    boolean flag=true;
    for(int i=0 ; i<args[0].length() ; i++){
      flag=Character.isDigit(args[0].charAt(i));...続きを読む


人気Q&Aランキング