/* コマンドライン引数処理を関数コンソールで再現&データを書き出すプログラム */ #include /* 標準入出力 */ #include /* freeとmemset */ #include /* strcpy使用 */ #include #include #include #define CHAR_MAX_MEMORY 2048 /* *1byte */ #define INT_MAX_MEMORY 1024 /* *2byte */ #define LONG_MAX_MEMORY 512 /* *4byte */ #define MEMORY 256 /* 配列メモリ */ typedef struct{ unsigned bool:1; }File; const static File *f; FILE *fp; void sub_main(); int option(char *argv[]); /* コマンドライン関数プロトタイプ宣言 */ int argfree(int *argc, char *argv[]); /* 解放 */ int AGUMENT_PARAMETER_LOOP_PRINT_FUNCTION(int argc,char *argv[]); /* 内容表示用 */ void delete(int ,char *[]); /*==================================================================================*/ #if 0 main(){sub_main();} /* メイン */ void sub_main(){ int argc; /* 引数(入力)の数 */ char *argv[MEMORY]; /* 入力内容 */ argc = 0; argc = option(argv); /* コマンドライン引数呼び出し */ AGUMENT_PARAMETER_LOOP_PRINT_FUNCTION(argc,argv); /* 内容表示用 */ /*getch();*/ fclose(fp); argfree(&argc,argv); exit(0); } #endif /*==================================================================================*/ /* 入力する文を、半角スペースで単語に区切る関数 引数 :*argv[] [io]スペースで区切った単語 へのポインタ配列 戻り値 :argc [io]スペースで区切った単語の数 */ int option(char *argv[]){ /* コマンドライン関数・引数 */ int argc; int i; /* 文字を見ていくループ変数用 */ short a; char szbuf[MEMORY]; /* 入力文の読み込み用配列 */ char *temp; /* それぞれの単語の先頭アドレス用 */ char *b; argc = 0; i = 0; a = 0; memset(szbuf,0x00,MEMORY); temp = NULL; b = NULL; /* printf("入力した内容をファイルにセーブします。\n" "セーブするファイル名を最初に入力後、\n" "半角スペースで単語を区切って入力してください。\n\n");*/ gets(szbuf); /* コンソールから入力 */ if(strcmp(szbuf,"exit")==0){ return -1; } for(i = 0; szbuf[i] != '\0'; i++){ /* 文字を見ていく */ if(szbuf[i]==' '){ /* 空白の場合は飛ばす */ continue; } else{ /* 空白ではない(文字の)場合*/ temp = &szbuf[i]; /* そこを先頭アドレスに */ for(i = i; szbuf[i] != ' '; i++){ /* 区切り(空白)を見つけるまで進める */ if(szbuf[i] == '\0'){ /* 途中で終わった時(単語をいくつか入力後すぐエンターの場合) */ break; /* もう終わりなので、空白を見つけるループから抜ける */ } /* ↑これをやらないとバグる*/ if(argc==0){ a++; } } if(szbuf[i] == ' '){ /* 区切りを見つけたとき */ szbuf[i] = '\0'; /* 区切りの最初をNULL化 */ } /*printf("argc=%d\n",argc);*/ argv[argc] = NULL; b = realloc(argv[argc],sizeof(char) * (strlen(temp) + 1) ); if(b==NULL){ printf("can't allocate.\n"); return -2; } argv[argc] = b; strcpy(argv[argc] , temp); /* 単語(文字)のコピー */ argc++; /* 引数の増加登録 */ } } if(a>8){ /* argv[0][8]='\0';*/ } return argc; } /*==================================================================================*/ int AGUMENT_PARAMETER_LOOP_PRINT_FUNCTION(int argc,char *argv[]){ /* 内容表示用 */ int i; int answer; if(argc >= 0){ printf("\n引数の数:%d\n\n",argc); } for(i = 0; i < argc; i++){ /* 引数の数だけ内容表示 */ printf("%d %p[%s]\n",i+1,argv[i],argv[i]); } if(argv[0]==NULL){ printf("\n\nその名前では書き込めませんでした。\n\n"); } #if 1 else if(argc > 0 && argv[0] != NULL){ printf("内容をファイルにセーブしますか?YES=1/NO=他 "); scanf("%d",&answer); fflush(stdin); if(answer == 1){ fp=fopen(argv[0],"r"); if(fp != NULL){ printf("[ %s ]はすでに存在します。上書きしますか?YES=1/NO=他 ",argv[0]); scanf("%d",&answer); fflush(stdin); } else{ answer = 1; } if(answer == 1){ fp=fopen(argv[0],"w"); if(fp==NULL){ printf("errorが発生しました!!その名前では書き込めませんでした.\n"); } else{ for(i = 0; i < argc; i++){ /* 引数の数だけ内容記録 */ fprintf(fp,"%d %p[%s]\n",i+1,argv[i],argv[i]); } printf("\nデータ内容を『 %s 』に書き出しました。\n",argv[0]); printf("これを読み込むには『 PRINTOOL 』を使ってください。\n\n"); } } } } #endif delete(argc,argv); return 0; }/*関数の終了*/ /*==================================================================================*/ void delete(int argc,char *argv[]){ int i; char sYes[MEMORY]; if(argc<=0){ goto end; } printf("\n履歴を削除しますか?YES=1/NO=他 "); gets(sYes); fflush(stdout); if(strcmp(sYes,"1")==0){ for(i = 0; i < argc; i++){ argv[i]=NULL; printf("%d %p\n",i+1,argv[i]); } } else{ for(i = 0; i < argc; i++){ printf("%d %p[%s]\n",i+1,argv[i],argv[i]); } } end : ; } /*==================================================================================*/ int argfree(int *argc,char *argv[]){ int i; fflush(stdin); rewind(stdout); for(i=0;i<*argc;i++){ if(argv[i] != NULL){ memset(argv[i],0x00,strlen(argv[i])); free(argv[i]); argv[i]=NULL; } } if(*argv!=NULL){ memset(&argv,NULL,sizeof(char*)); free(*argv); *argv = NULL; argv = NULL; } for(i=0;i<*argc;i++){ if(argv[i] != NULL){ return -1; } } *argc = 0; argc = NULL; if(*argv!=NULL){ return -2; } else{ return 0; } } /* これを他.cと同じディレクトリ上に置いて他.cで#includeすればoption関数が使えます! このプログラム単体で動かす場合にはメインの#ifを1にしてコンパイル→実行して下さい */