ver.1では対応できない複数行の
プロトタイプ宣言に対応するため
目的を達成するにはfgetsを使わない方法が必要
どのようにコードを書き換えるといいと思いますか?
読み込み方としては
- 前から探す方法
- 後ろから探し一致する部分があったら戻りなっがら出力
ver.1
► スポイラーを表示
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BASE "C:\\borland\\bcc55\\Include\\"
void search(char [],char [],int);
void strchg(char *, const char *, const char *);
int main(int argc,char *argv[]){
int flag;
if(argc==1){
printf("引数は1つか2つ必要です。\n");
printf(" 例:%s 関数名\n",argv[0]);
printf(" 例:%s 関数名 /all\n",argv[0]);
return 1;
}
if(argc==2)flag=0;
else if(argc==3&&strcmp(argv[2],"/all")==0)flag=1;
else{
printf("引数が不正です。\n");
return 1;
}
search(argv[1],BASE"stdio.h",flag);
search(argv[1],BASE"stdlib.h",flag);
search(argv[1],BASE"string.h",flag);
search(argv[1],BASE"_str.h",flag);
search(argv[1],BASE"math.h",flag);
search(argv[1],BASE"windows.h",flag);
search(argv[1],BASE"stdlib.h",flag);
search(argv[1],BASE"assert.h",flag);
search(argv[1],BASE"ctype.h",flag);
return 0;
}
void search(char argv1[],char dot_h[],int flag){
FILE *file = fopen(dot_h, "r");
char string[100];
while(fgets(string, 100, file)!=NULL){
if(strstr(string, argv1)){
strchg(string,"_RTLENTRY","");
strchg(string,"_EXPFUNC","");
while(strstr(string," "))strchg(string," "," ");
strchg(string,"\n","");
strchg(dot_h,"C:\\borland\\bcc55\\Include\\","");
//if(string[0]=="/*")
printf("%-10s: %s\n", dot_h, string);
if(flag==0)break;
}
}
fclose(file);
return;
}
void strchg(char *buf, const char *str1, const char *str2){
char *p = strstr(buf, str1);
if (p) {
int len = strlen(buf) + 1, len1 = strlen(str1), len2 = strlen(str2);
do {
len -= p - buf + len1;
buf = p + len2;
memmove(buf, p + len1, len);
memcpy(p, str2, len2);
} while ((p = strstr(buf, str1)) != NULL);
}
}
► スポイラーを表示
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BASE "C:\\borland\\bcc55\\Include\\"
void search(char [],char [],int);
void strchg(char *, const char *, const char *);
int main(int argc,char *argv[]){
int flag;
if(argc==1){
printf("引数は1つか2つ必要です。\n");
printf(" 例:%s 関数名\n",argv[0]);
printf(" 例:%s 関数名 /all\n",argv[0]);
return 1;
}
if(argc==2)flag=0;
else if(argc==3&&strcmp(argv[2],"/all")==0)flag=1;
else{
printf("引数が不正です。\n");
return 1;
}
search(argv[1],BASE"stdio.h",flag);
search(argv[1],BASE"stdlib.h",flag);
search(argv[1],BASE"string.h",flag);
search(argv[1],BASE"math.h",flag);
search(argv[1],BASE"windows.h",flag);
search(argv[1],BASE"iostream.h",flag);
search(argv[1],BASE"assert.h",flag);
search(argv[1],BASE"ctype.h",flag);
return 0;
}
void search(char argv1[],char dot_h[],int flag){
FILE *fp = fopen(fot_h,"r");
long n,m;
int ch,i;
fseek(fp, 0, SEEK_END); /* ファイルの末尾に移動 */
n=ftell(fp); /* 最後の場所を記録 */ //fgetposと同じかと思われる
i=strlen(argv1)-1;m=n;
while (--n>=0) {// --nされてから n>=0 を評価
fseek(fp, n, SEEK_SET); /* 先頭からn番目の位置に移動 */
ch=fgetc(fp); /* 読む */
if(i<0)break;//探索成功
if(ch==argv1[i]){
i--;
}else{
i=strlen(argv1)-1;
n=(--m);
}
}
fclose(fp);
return 0;
}