プログラムのコマンド引数を使った流れを解説してください

このQ&Aのポイント
  • プログラムのコマンド引数を使った流れを解説してください。
  • 以下のプログラムはコマンド引数を使用して日数を指定し、その日数後の日付を計算するプログラムです。
  • プログラムの実行時にコマンド引数で日数を指定し、その日数後の日付を計算し出力します。
回答を見る
  • ベストアンサー

プログラムの内容

以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

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

  • ベストアンサー
  • 246riser
  • ベストアンサー率50% (2/4)
回答No.1

まず、コマンド引数を使うプログラムは、コマンドラインを使って実行する際に、 「実行ファイル名+スペース+引数」 を入力します。このときの引数を「コマンド引数」とか言います。(あ、「実行ファイル名」も引数です) 「argc」とは、この引数の数を指し、その数には上述のように実行ファイル名も含まれるため、「実行ファイル名+スペース+引数」の場合、argcは2になります。 「argv」とは、この引数の内容(文字列)です。char型ポインタの配列になっているため、複数の引数の入力が可能であることが分かります。 main関数内の変数宣言後の最初のif文でargcが2未満であるかどうかを調べています。これはコマンド引数が入力されていない場合を想定していると思われます。コマンド引数が入力されていない場合、勝手に10000日後の日時を表示するようになると思われます。argcが2以上である場合(つまり実行ファイル名+スペース+引数(指定の日数)の形の場合)、指定された日数分未来の日時を表示するようになると思われます。

Flieger
質問者

お礼

なるほど、理解しました。 コマンドラインを使用しなければ単に10000日後を求めるだけなのですね・・・。

関連するQ&A

  • ソースプログラムのエラー

    自分で四則演算のプログラムを組んだのですが エラーが出てお手上げ状態です。 どこが間違っているのかどなたか教えていただけませんか?? ちなみに足し算の場合はいくつ足しても計算できるという プログラムです☆ #include<stdio.h> int main(int argc, char *argv[]){ int i,a=0,b=0,x=0; int m=0; if(argv[1]!="+"||argv[1]!="-"||argv[1]!="*"||argv[1]!="/"||){ printf("指定された文字ではありませんよ\n"); return -1; } a = atoi(argv[2]); b = atoi(argv[3]); if(argv[1]=="-"){ m=a-b; } if(argv[1]=="*"){ m=a*b; } if(argv[1]=="/"){ m=a/b; } if(argv[1]=="+"){ for(i=2;i<argc;i++){ x=atoi(argv[i]); m+=x; } printf("%d\n",m); 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); }

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

    C言語で分からないところがあるのですが…… すみません。C言語を学習していてつまづいたので、皆さんの意見を聞きたいと思います。 現在、カレンダーを表示するプログラムをつくっています。 Yearとmonthをユーザが入力すると、その年その月のカレンダーが出るという算段です。(画像貼っておきます。ソースコードは下) これはできました。 これをいじって、Yearをユーザから受け取ると、その年の1月から12月までのカレンダーがば~っと表示されるようにしろ、と言われました。 Yearとmonthを受け取って書くやつは友人の助けを得ながらなんとかかけましたが、もう無理です。多分、for文を使うんだと思うんですが……助けてください! #include <stdio.h> int dayofweek(int year, int month); int daysinmonth(int year, int month); int daysinyear(int year); void showcal(int dow, int days); int main(void) { int year, month; int dow; int dim; printf ("Year?: "); scanf ("%d", &year); printf ("Month?: "); scanf ("%d", &month); dow = dayofweek(year, month); dim = daysinmonth(year, month); showcal(dow, dim); return 0; } void showcal (int dow, int days) { int i, j, d; printf ("Su Mo Tu We Th Fr Sa\n"); d = 1; for (i = 0; i < dow; i++) { printf (" "); } for (; i < 7; i++) { printf (" %d ", d); d++; } printf("\n"); for (j = 0; d <= days; j++) { for (i = 0; i < 7 && d <= days; i++) { if (d < 10) printf (" %d ", d); else printf ("%d ", d); d++; } printf("\n"); } } int daysinmonth( int year, int month) { int dim; dim = 31; if (month == 4 || month == 6 || month == 9 || month == 11) dim = 30; if (month == 2) { if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) dim = 29; else dim = 28; } return dim; } int daysinyear( int year) { int diy; if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) diy = 366; else diy = 365; return diy; } int dayofweek (int year, int month) { int dow; int days; int y, m; if (year >= 2000) { days = 0; for ( y = 2000; y < year; y++ ) { days = days + daysinyear(y); } for ( m = 1; m < month; m++ ) { days = days + daysinmonth(year, m); } dow = (6 + days) % 7; } else { days = 0; for ( m = month; m <= 12; m++ ) { days = days + daysinmo

  • Cで書かれたユークリッド互除法プログラムをJavaに

    a と b とを与えて d=GCD(a,b) と ax+by=d の解 x,y を与えるプログラム: #include<stdio.h> void f(int a,int b,int*d,int*x,int*y) { int x1,y1; if(b==0) {*x=(a>=0?1:-1); *y=0; *d=abs(a);} else { f(b,a%b,d,&x1,&y1); *x=y1; *y=x1-(a/b)*y1; } return;} int main(int argc, char**argv) { int a,b,d,x,y; if(argc!=3) exit(0); f(a=atoi(argv[1]), b=atoi(argv[2]), &d, &x, &y); printf("\n %d * %d + %d * %d = %d \n\n", a,x,b,y,d); } 上記のCプログラムをJavaに書き換えたいのですが、まったくといっていいほど手も足も出ません。 Javaはまだ初心者なもので… どなたか詳しい方、どうかアドバイス、またはご教授お願い致します。

    • ベストアンサー
    • Java
  • 万年カレンダで祝日にマークを付けるには

    祝日に関して、下記の通りプログラムを作ったのですがうまくいきません。ご教授お願いします。 void Display_func( int year , int month ) {   int week , i , leap , day , *shuku , *furikae ;   int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};   int d = 0; **省略**   for( i=0 ; i<week ; i++ ){      printf(" ");   }   for(day=1 ; day<=days[month] ; day++ ){ ★★Yasumi_func( int &shuku , int &furikae ); /*祝日判定関数*/   if(i==0){     printf(" @%2d",day);   }else if(i==*shuku){      printf(" #%2d",day);   }else if(i==*furikae){     i = 1;     printf(" &%2d",day+1);   }else if(i==6){     printf(" *%2d",day);   }else{     printf(" %2d",day);   } 略 @:日曜日 *:土曜日 &:振替休日 #:祝日 return; } /* 祝日判定関数 */ void Yasumi_func( int *yshuku , int *furikae ) { int year , month , day , i ; if((month==3 && day== (int)(20.8431 + 0.242194*(year-1980) - (year-1980)/4))   || (month==1 && day>7 && day<15 && i==1) 略   || (month==11 && day==3)   || (month==12 && day==23))   {     if(i == 0){       *furikae = i ;      /* 振替休日 */     }else{       *shuku = i; /* 祝日 */     }   } }   Yasumi_func( int &yasumi , int &kae ); 祝日判定関数を呼びたいのですが「式の構文エラー」となってしまいます。 この他   if(i == 0){     *furikae = i ;   }else{     *shuku = i;   } この部分も自信がないので、アドバイスお願いいたします

  • C言語 実行エラー 10000日先が表示されない 

    今10000日先後の年、月、日を求めていて下のプログラムを 考えたんですけど、コンパイルは通るんですが結果がうまくいきません↓ どこがおかしいですか? #include<stdio.h> int leapYear(int); int Date(int,int,int,int); int main(void){ int year,i=0,month,date,date2=10000,emp=0; printf("年>>"); scanf("%d",&year); printf("月>>"); scanf("%d",&month); printf("日>>"); scanf("%d",&date); Date(year,month,date,date2);//date2から各月の日数を引いていく printf("year=%d month=%d date=%d date2=%d \n",year,month,date,date2); return 0; } int leapYear(int year){ //うるう年を求める if(year%400==0){ return 1; } else if(year%4==0 && year%100!=0){ return 1; } else return 0; } int Date(int y,int m,int d,int d2){ for(;;y++){ if(d2<0) return y,m,d,d2; for(;m<=12 || d2>=0;m++){ if(leapYear(y)==1){ if(m==4||m==6||m==9||m==11){ d2-(30-d); } else if(m==2) d2-(29-d); else d2-(31-d); } else if(m==4||m==6||m==9||m==11){ d2-(30-d); } else if(m==2) d2-(28-d); else d2-(31-d); } } }

  • 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; }

  • カレンダー作成

    C言語初心者です。 西暦と月を入力してその月のカレンダーを作成するプログラムの問題なのですが #include <stdio.h> #define MMAX 12 #define COMP (year - 1) int main(void) {  int i, j, year, month, day, youbi, ycnt, mcnt = 0;  int mday[MMAX] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  printf("西暦と月を入力して下さい-->");  scanf("%4d%2d, &year, &month");  if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)   mday[1] = 29;  for (i = 0; i < [A]; i++) {   mcnt += mday[i];  }  mcnt++;  [B] = ((COMP + COMP / 4 - COMP / 100 + COMP / 400) + mcnt) % 7;  printf("\n%4d 年%2d 月\n", year, month);  printf("----------------------------\n");  printf(" 日 月 火 水 木 金 土\n");  for (j = 0, ycnt = 0; j < youbi; j++, ycnt++) {   printf(" ");  }  for (day =1; day <= mday[month - 1]; day++) {   if ([C])    printf("[%2d]", day);   else    printf(" %2d ", day);   ycnt++;   if ([D]) {    printf("\n");    ycnt = 0;   }  }  return (0); } [A]、[B]、[C]、[D]に答えを入れなきゃいけないのですが私が考えた答えだと カレンダーの表示すらされません。どこがいけないのでしょうか? #include <stdio.h> #define MMAX 12 #define COMP (year - 1) int main(void) {  int i, j, year, month, day, youbi, ycnt, mcnt = 0;  int mday[MMAX] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  printf("西暦と月を入力して下さい-->");  scanf("%4d%2d, &year, &month");  if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)   mday[1] = 29;  for (i = 0; i < month; i++) {   mcnt += mday[i];  }  mcnt++;  youbi = ((COMP + COMP / 4 - COMP / 100 + COMP / 400) + mcnt) % 7;  printf("\n%4d 年%2d 月\n", year, month);  printf("----------------------------\n");  printf(" 日 月 火 水 木 金 土\n");  for (j = 0, ycnt = 0; j < youbi; j++, ycnt++) {   printf(" ");  }  for (day =1; day <= mday[month - 1]; day++) {   if (youbi = 0)    printf("[%2d]", day);   else    printf(" %2d ", day);   ycnt++;   if (youbi > 7) {    printf("\n");    ycnt = 0;   }  }  return (0); } よろしくお願いします。

  • プログラムの関数化

    皆様に助けていただき、なんとかコーディング出来たのですが、関数化したいと思います。アドバイスお願いします。 int overflow_check1(); int overflow_check2(); int overflow_check3(); int overflow_check4(); int lop; // 左のオペランドに入力する値 int rop; // 右のオペランドに入力する値 int result; // 計算結果 int mod; // 除算の余り int max = INT_MAX; // 表現可能な最大値 int min = INT_MIN; // 表現可能な最小値 char *check; // 変換不能な文字を格納 char op; // 入力する演算子 int main ( int argc, char *argv[] ) { /* 引数の個数チェック */ if ( argc != 4 ) { printf ( "usage : %s lop op rop\n", argv[0] ); exit ( 0 ); } /* 引数を取得して整数型に変換 */ lop = atoi ( argv[1] ); rop = atoi ( argv[3] ); /* 引数の取得 */ op = ( argv[2][0] ); /* startが整数であるか文字であるかのチェック */ lop = strtol ( argv[1], &check, 10 ); if ( errno != ERANGE ) { if ( *check != '\0' ) { printf ( "error : 整数を入力して下さい。\n" ); exit ( -1 ); } /* startに範囲を超えた値を入力した場合 */ } else { printf( "error : 整数型の範囲を超えました。\n" ); exit( -1 ); } /* endが整数であるか文字であるかのチェック */ rop = strtol ( argv[3], &check, 10 ); if ( errno != ERANGE ) { if ( *check != '\0' ) { printf ( "error : 整数を入力して下さい。\n" ); exit ( -1 ); } /* endに範囲を超えた値を入力した場合 */ } else { printf( "error : 整数型の範囲を超えました。\n" ); exit( -1 ); } /* argv[2]が2文字以上の場合 */ if ( strlen ( argv[2] ) >= 2 ) { printf ( "error : 演算子を正しく入力して下さい。\n" ); exit ( -1 ); } /* argv[2]に入力された演算子が'+'の場合 */ switch ( op ) { case '+': overflow_check1(); result = lop + rop; break; /* argv[2]に入力された演算子が'-'の場合 */ case '-' : overflow_check2(); result = lop - rop; break; /* argv[2]に入力された演算子が'*'の場合 */ case '*': overflow_check3(); result = lop * rop; break; /* argv[2]に入力された演算子が'/'の場合 */ case '/' : /* 0による除算 */ if ( rop == 0 ) { printf ( "error : 0による除算は禁止です。\n" ); exit ( -1 ); } overflow_check4(); result = lop % rop; // 剰余を求める break; default: printf ( "error : '+' '-' '*' '/'のいずれかの演算子を入力して下さい。\n" ); exit ( -1 ); } /* 割り算の結果として余りが出なかった場合 */ if ( result == 0 ) { result = lop / rop; printf ( "%d %c %d = %d", lop, op, rop, result ); exit ( 0 ); /* 割り算の結果として余りが出た場合 */ } else { result = lop / rop; mod = lop % rop; printf ( "%d %c %d = %d余り%d", lop, op, rop, result, mod ); exit ( 0 ); } /* 数値1 演算子 数値2 = 演算結果の形式で出力する */ printf ( "%d %c %d = %d", lop, op, rop, result ); exit ( 0 ); } int overflow_check1 () { /* オーバーフローのチェック */ if ( lop > 0 && rop > 0 ) { if ( lop > max - rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } } /* オーバーフローのチェック */ if ( lop < 0 && rop < 0 ) { if ( lop < min - rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } } return 0; } int overflow_check2 () { /* オーバーフローのチェック */ if ( lop > 0 && rop < 0 ) { if ( lop > max + rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } } /* オーバーフローのチェック */ if ( lop < 0 && rop > 0 ) { if ( lop < min + rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } } return 0; } int overflow_check3 () { /* オーバーフローのチェック */ if ( lop > max / rop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( -1 ); } /* オーバーフローのチェック */ if ( rop < max / lop ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( 0 ); } return 0; } int overflow_check4 () { /* オーバーフローのチェック */ if ( ( lop == min ) && ( rop == -1 ) ) { printf ( "error : オーバーフローが起こります。\n" ); exit ( -1 ); } return 0; }

  • ポインタのポインタ

    #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv){ int i; if(argc != 2) { fprintf(stderr, "Usage: %s vector\n\tEx: %s 11110000\n", argv[0], argv[0]); return 1; } for(i=0;i<8;i++){ if(**argv == '0'){ printf("%d\n",i); } else{ printf("A%d\n",i); } argv++; } return 0; } コンパイルして./a.exe 10010011などと入力しても A0 A1 Segmentation Faultとなります。 どうすれば、 A1 0 ・・・省略 for文で回した8回分、出力が可能になるのか教えてください。 初歩的な質問ですいません。

専門家に質問してみよう