• ベストアンサー

文章中から特定の文字列を抜き出すプログラムについて C言語

log.txtの文章からIPを抜き出しip.txtに書き込むというものです。log.txtの文章は基本的にfrom IP:port の順です。しかし文章中にfromがないとip.txtで空欄になってしまいます。 例192.168.1.100  192.168.1.110 理想はfromがない行はなにも追加せず次に移りたいのですがどうすればいいでしょうか? 例192.168.1.120 192.168.1.130 192.168.1.140 void addLine(const char*,FILE*); char *getFromIP(const char*,char*); int main() { FILE *pFileA = fopen("log.txt","rt"); char buff[256]; if(pFileA){ FILE *pFileB = fopen("ip.txt","wt"); if(pFileB){ for(;fgets(buff,256,pFileA) != NULL;){ char buff2[32] = {'\0'}; addLine(getFromIP(buff,buff2),pFileB); } fclose(pFileB); } fclose(pFileA); } return 0; } char *getFromIP(const char *line, char *buff) {  char *src, *dst;        src = strstr(line, "from");  if(src==NULL) { return buff; }   src += 4;            dst = buff;          while(1) {   if(isspace(*src))  {    src++;    continue;          }   else break;         }                    while(1) {   *dst = *src;          if(*dst == ':')        {    *dst = '\0';          break;           }   if(*dst == '\0')       {   break;           }  dst++;            src++;           }  return buff;         } void addLine(const char *str,FILE *pFile){ char buff[1024]; sprintf(buff,"%s\n",str); fputs(buff,pFile); }

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

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

ソースコードはもう少し読みやすく張って欲しいな。 まず、main関数内でbuff2が宣言されてないようだけど、これは動くコード? それとgetFromIP内では以下の部分で >  if(src==NULL) > { < buff[0]='\0'; > return buff; > }  上記のようにbuffを空文字列にしておかないと空行も出ないと思う。 それで肝心の空行を出さないためにはaddLineで > sprintf(buff,"%s\n",str); の部分を < if (strlen(str)>0) { <  sprintf(buff,"%s\n",str); < } のようにIPが空だったら表示抑制することで対応できる。 サンプルコードを元に簡単に修正するとこんな感じ。 動作確認はしてないので他にも問題はあるかもしれないけど。

masarui
質問者

お礼

ありがとうございました。理想通りにIPが抜き出せるようになりました。 ソースコードに関しましては、文字数オーバーになったため無理やり色々削ったので見にくくなってしまいました^^;

その他の回答 (1)

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

fromというのは単純に"from"という文字列ですか?それなら単純に下記の通りでよいのでは… -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include <stdio.h> #include <stdlib.h> #include <errno.h> int main(void) { char buf[BUFSIZ], ip[BUFSIZ]; FILE *fin, *fout; if ((fin = fopen("log.txt","r")) == NULL) { fprintf(stderr, "Can't open log.txt\n"); exit (errno); } if ((fout = fopen("ip.txt", "w")) == NULL) { fprintf(stderr, "Can't opem ip.txt\n"); exit (errno); } while (fgets(buf, BUFSIZ, fin) != NULL) { if (sscanf(buf, "from %[^:]", ip) == 1) { fprintf(fout,"%s\n", ip); } } return 0; }

関連するQ&A

  • このプログラムのアルゴリズムを教えていただけませんか?

    ファイルlog.txtの文章中からIPアドレスを抜き出し、ip.txtに書き込むというプログラムです。文章は 日付 http attempt from xxxx.xxxx.xxxx.xxxx:ポート番号とう具合に並んでいます。 /* ・・・ from IP:portなフォーマットが前提*/ より下でIPを検出しているとおもうのですが、具体的にどういう手順で検出しているのかわかりません。 どうか宜しくお願いします。 #include <stdio.h> #include <string.h> void addLine(const char*,FILE*); char* getFromIP(const char*,char*); int main() { FILE* pFileA = fopen("log.txt","rt"); char buff[256]; if(pFileA){ FILE* pFileB = fopen("ip.txt","wt"); if(pFileB){ for(;fgets(buff,256,pFileA) != NULL;){ char buff2[32] = {'\0'}; addLine(getFromIP(buff,buff2),pFileB); } fclose(pFileB); } fclose(pFileA); } return 0; } /* ・・・ from IP:portなフォーマットが前提*/ char* getFromIP(const char* line,char* buff){ const size_t length = strlen(line); size_t top,back = length-1,i,k; for(back = length-1;line[back] != ':';--back); for(i=0,top = back - 1;i<3;++i){ for(;line[top] != '.';--top); } for(;line[top-1] != ' ';--top); for(i=top,k=0;i<back;buff[k++] = line[i++]); return buff; } void addLine(const char* str,FILE* pFile){ char buff[1024]; sprintf(buff,"%s\n",str); fputs(buff,pFile); }

  • c言語 DFAのプログラム

    DFAを受理するプログラムを組んでいるのですが、コンパイルして動作させるとすぐに終わってしまいます。 どこがいけないのでしょうか…。助言を求めています。 手探りでやっているのですが、ファイル読み込みなど、基本的な所からわかっていない状態です。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <getopt.h> enum { NFA_0_2_3_5, NFA_0_1_2_3_5_6_7_8_10_11_12, NFA_4_7_8_10, NFA_11_12, NFA_9_12, NFA_13_15_16, NFA_14 }; int regex(char *txt, int idx); int DFA_match(char *txt, int startIndex); int main (int argc, char *argv[]) { int c, i, m, idx; char text[1024], *pattern; FILE *fp; pattern = argv[optind++]; for (i = optind; i < argc; i++) { fp = fopen(argv[i], "r"); if (fp == NULL) { fprintf(stderr, "File %s: open failed.\n", argv[i]); } else { while (fgets(text, sizeof(text), fp) != NULL) { m = 0; for (idx = 0; (idx = regex(text, idx)) >= 0; idx++) { m++; } if (m > 0) { printf("%s: %s", argv[i], text); } } } } return 0; } int DFA_match(char *txt, int startIndex) { int DFAstate = NFA_0_2_3_5; int acceptLen = -1; int i; for (i = startIndex; txt[i] != '\0'; i++) { switch (DFAstate) { case NFA_0_2_3_5: switch(txt[i]){ case 'x': DFAstate = NFA_0_1_2_3_5_6_7_8_10_11_12; break; case 'z': DFAstate = NFA_4_7_8_10; break; default: return acceptLen; } break; case NFA_0_1_2_3_5_6_7_8_10_11_12: switch(txt[i]){ case 'x': DFAstate = NFA_0_1_2_3_5_6_7_8_10_11_12; break; case 'z': DFAstate = NFA_4_7_8_10; break; case 'y': DFAstate = NFA_9_12; break; default: return acceptLen; } break; case NFA_4_7_8_10: switch(txt[i]){ case 'x': DFAstate = NFA_11_12; break; case 'y': DFAstate = NFA_9_12; break; default: return acceptLen; } break; case NFA_11_12: switch(txt[i]){ case 'y': DFAstate = NFA_9_12; break; default: return acceptLen; } break; case NFA_9_12: switch(txt[i]){ case 'y': DFAstate = NFA_13_15_16; acceptLen = i; break; default: return acceptLen; } break; case NFA_13_15_16: switch(txt[i]){ case 'x': DFAstate = NFA_14; break; default: return acceptLen; } break; case NFA_14: switch(txt[i]){ case 'y': DFAstate = NFA_13_15_16; acceptLen = i; break; default: return acceptLen; } break; } } return acceptLen; } int regex(char *txt, int idx) { int i; for (; idx < strlen(txt); idx++) { if ( (i = DFA_match(txt, idx)) > 0) { printf("matched!\n"); return idx; } } return -1; }

  • 文字列の中から必要なデータを抜き出す

    VC++6.0 です。 計測機器から受信したデータ(文字列)の中から、必要なデータだけを抜き出したいのですが、 うまく抜き出すことが出来ません。アドバイスいただけませんでしょうか? 受信する文字列は 伝送制御キャラクタSTX(0x02) "文字列" 伝送制御キャラクタETX(0x03) のように受信します。 抜き出すための目印?がキーボードで入力できるような文字列の場合は過去ログにありました以下のコードで 抜き出すことが可能でした。 抜き出すための目印を 0x02 や 0x03 にする為にはどうしたら良いでしょうか?   //文字列版 #include <stdio.h> #include <string.h> #include <stdlib.h> char *cut(const char *str, const char *ss, const char *es, char *buff){ /* str の ss の次から es の前までの文字列をbuff に切り出す */ char *wk, *s, *e, *c; wk=strdup(str); if(wk==NULL)return NULL; s=strstr(wk, ss); if(s==NULL){ free(wk); return NULL;} c=s+strlen(ss); e=strstr(c, es); if(e==NULL){ free(wk); return NULL; } *e='\0'; strcpy(buff, c); free(wk); return buff; } int main(void){ const char url[]="?http://www.sample.ne.jp/";? char buff[32]; printf("//~/:%s\n", cut(url , "//", "/", buff)); return 0; }

  • Cの関数定義で見慣れない記述がありました

    libeventというソフトのソースに以下のような関数定義がありました。 この関数の定義部分が見慣れないものでした。 この関数は、size_tを戻り値としてもち、_event_strlcpyという名前で、 引数として、dst, src, sizの三つをもつというのはわかるのですが、 どうして_event_strlcpy(dst, src, siz)のように、 引数に型が宣言されていないのでしょうか?こういう書き方はアリなのですか? 普通は、_event_strlcpy(char *dst, const char *src, size_t size) というように書くものではないでしょうか? しかも、_event_strlcpy(dst, src, siz)の次の行からの、 char *dst;const char *src;size_t size;の三行は何なのでしょうか? このような位置にこういった書き方をするのはアリなのですか? size_t _event_strlcpy(dst, src, siz) char *dst; const char *src; size_t siz; { register char *d = dst; register const char *s = src; register size_t n = siz; /* Copy as many bytes as will fit */ if (n != 0 && --n != 0) { do { if ((*d++ = *s++) == 0) break; } while (--n != 0); } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { if (siz != 0) *d = '\0'; /* NUL-terminate dst */ while (*s++) ; } return(s - src - 1); /* count does not include NUL */ }

  • C言語について

    以下のプログラムについて alice.txtからテキストを読み込みその中の異なる単語の数を求めるプログラムです #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stddef.h> #include<ctype.h> #define NMAX 80 #define LMAX 5000 void count(int); void all_words(void); FILE *fp, *fp2; char *fn="alice.txt"; char *fn2="total word.txt"; const char *ignore="\n !?()*-;:.,_\"[]"; int main(void){ int p=0, x=0, c, l, t=0; char word3[LMAX][NMAX]; char word1[NMAX]; char word2[NMAX]; char *tp; char *tp2; if((fp=fopen(fn,"r"))==NULL){ printf("Can't open '%s'.\n",fn); return -1; } if((fp2=fopen(fn2,"w"))==NULL){ printf("Can't open '%s'.\n",fn2); return -1; } for(c=0;c<LMAX;c++){ if(fgets(word3[c],NMAX,fp)==NULL) break; p++; } for(c=0;c<p;c++){ for(x=0;x<NMAX;x++){ word1[x]=tolower(word3[c][x]); } tp=word1; while((tp2=(char*)strtok(tp,ignore))!=NULL){ if(*tp2=='\''){ if(*(tp2+1)=='`'){ t=1; } tp2++; } strcpy(word2,tp2); l=strlen(word2)-1; if(word2[l]=='\''){ word2[l]='\0'; } if(word2[l]==l){ word2[l]='\0'; } if(word2[0] =='\'' &&t==0){ if(word2[1]!='\0'){ fputs(word2+1,fp2); fputc('\n',fp2); } } else{ if(word2[0]!='\0'){ fputs(word2,fp2); fputc('\n',fp2); } } tp=NULL; } } fclose(fp); fclose(fp2); all_words(); return 0; } void all_words(void){ char word3[NMAX]; int n=0; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); return; } for(;;){ if(fgets(word3, NMAX,fp2)==NULL){ break; } n++; } fclose(fp2); count(n); } void count(int n){ int c, x, y=0; char *m=(char *)malloc(n*NMAX); char *xp; char *yp; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); free(m); return; } for(c=0,xp=m; c<n;c++,xp+=NMAX){ fgets(xp,NMAX,fp2); } qsort(m,n,NMAX,(int (*)(const void*, const void*))strcmp); c=1; for(x=0,xp=m,yp=m+NMAX;x<n-1;xp+=NMAX,yp+=NMAX,x++){ if(strcmp(xp,yp)==0){ y++; c++; } else{ c=1; } } printf("%d\n",n-y); free(m); fclose(fp2); } このプログラムを実行するとメモリリークになってしまうのですが 確保していないメモリ領域に代入しているのが原因らしいのですが いろいろ試してみたのですがメモリリークが直りません どうしたらよいでしょうか? よろしくお願いします

  • C言語について

    以下のプログラムについて alice.txtからテキストを読み込みその中の異なる単語の数を求めるプログラムです #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stddef.h> #include<ctype.h> #define NMAX 80 #define LMAX 5000 void count(int); void all_words(void); FILE *fp, *fp2; char *fn="alice.txt"; char *fn2="total word.txt"; const char *ignore="\n !?()*-;:.,_\"[]"; int main(void){ int p=0, x=0, c, l, t=0; char word3[LMAX][NMAX]; char word1[NMAX]; char word2[NMAX]; char *tp; char *tp2; if((fp=fopen(fn,"r"))==NULL){ printf("Can't open '%s'.\n",fn); return -1; } if((fp2=fopen(fn2,"w"))==NULL){ printf("Can't open '%s'.\n",fn2); return -1; } for(c=0;c<LMAX;c++){ if(fgets(word3[c],NMAX,fp)==NULL) break; p++; } for(c=0;c<p;c++){ for(x=0;x<NMAX;x++){ word1[x]=tolower(word3[c][x]); } tp=word1; while((tp2=(char*)strtok(tp,ignore))!=NULL){ if(*tp2=='\''){ if(*(tp2+1)=='`'){ t=1; } tp2++; } strcpy(word2,tp2); l=strlen(word2)-1; if(word2[l]=='\''){ word2[l]='\0'; } if(word2[l]==l){ word2[l]='\0'; } if(word2[0] =='\'' &&t==0){ if(word2[1]!='\0'){ fputs(word2+1,fp2); fputc('\n',fp2); } } else{ if(word2[0]!='\0'){ fputs(word2,fp2); fputc('\n',fp2); } } tp=NULL; } } fclose(fp); fclose(fp2); all_words(); return 0; } void all_words(void){ char word3[NMAX]; int n=0; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); return; } for(;;){ if(fgets(word3, NMAX,fp2)==NULL){ break; } n++; } fclose(fp2); count(n); } void count(int n){ int c, x, y=0; char *m=(char *)malloc(n*NMAX); char *xp; char *yp; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); free(m); return; } for(c=0,xp=m; c<n;c++,xp+=NMAX){ fgets(xp,NMAX,fp2); } qsort(m,n,NMAX,(int (*)(const void*, const void*))strcmp); c=1; for(x=0,xp=m,yp=m+NMAX;x<n-1;xp+=NMAX,yp+=NMAX,x++){ if(strcmp(xp,yp)==0){ y++; c++; } else{ c=1; } } printf("%d\n",n-y); free(m); fclose(fp2); } このプログラムを実行するとメモリリークになってしまうのですが 確保していないメモリ領域に代入しているのが原因らしいのですが いろいろ試してみたのですがメモリリークが直りません どうしたらよいでしょうか? よろしくお願いします

  • C言語のqsortについて

    下記の課題に取り組んでおり、qsortをファイルの行数分のみ出力するプログラムを書いているのですが if (strcmp(ad, "ASC") == 0) { qsort(sin,1000 , sizeof(sin[0]), cmp_u); if (sin[i][0] == 0) { break; } } else { qsort(sin, 1000, sizeof(sin[0]), cmp_d); if (sin[i][0] == 0) { break; } この書き方ではエラーが出てしまい、どなたか書き方を教えて頂けないでしょうか? 【課題】 電卓アプリケーションの作成  以下の機能を満たすアプリケーションを作成してください。  ※画面の表示やログの形式は原則として例示されている内容に従ってください。  1) 四則演算が出来ること  2) コンソールから計算対象となる数値と演算子を受け取る    例) 5 + 6  3) 結果をコンソール上に表示する    例) 11  4) 演算結果と実行した日、時間、秒をログファイルとして保存する    ログの上限は1000行とする(上限を超過するケースはひとまず考慮しなくて良い)    例) log.txt に 以下の内容を記録      2015/04/27 14:30:51, 5 + 6, 11  5) コンソールからパラメータを受け取り、ログを実行時間の昇順/降順に並べ替えて    コンソールに表示する    例) ASC を入力      2015/04/26 10:20:00, 5 + 6, 11      2015/04/27 14:30:51, 7 - 6, 1      2015/04/27 15:30:00, 7 + 8, 15      2015/04/28 14:30:51, 8 + 9, 17    例) DESC を入力      2015/04/28 14:30:51, 8 + 9, 17      2015/04/27 15:30:00, 7 + 8, 15      2015/04/27 14:30:51, 7 - 6, 1      2015/04/26 10:20:00, 5 + 6, 11 【現在のソースコード】 #include <stdio.h> #include <time.h> #include <string.h> #include <stdlib.h> static char ad[10]; int cmp_u(const void* a, const void* d) { return strcmp((char*)a, (char*)d); } int cmp_d(const void* a, const void* d) { return strcmp((char*)d, (char*)a); } int main() { int num1, num2; char op; float answer; int r,i,n; FILE* fp; char c[11]; char sin[1000][1000]; char ad[8]; fp = fopen("log.txt", "a+"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } while (1) { r = scanf("%d%c%d", &num1, &op, &num2); if (r != 3) { puts("input error"); return 1; } if (op == '+') { answer = num1 + num2; } else if (op == '-') { answer = num1 - num2; } else if (op == '*') { answer = num1 * num2; } else if (op == '/') { answer = (float)num1 / num2; } time_t t = time(NULL); struct tm* tm = localtime(&t); printf("%d/%02d/%02d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); printf("%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); printf("%d%c%d,%f\n", num1, op, num2, answer); fprintf(fp, "%d/%02d/%02d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); fprintf(fp, "%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); fprintf(fp, "%d%c%d,%f\n", num1, op, num2, answer); printf("計算を続けますか?"); scanf("%s\n", &c); if (strcmp(c, "no") == 0) { break ; } } fclose(fp); fp = fopen("log.txt", "r"); for (i = 0;i < 1000;i=i+1) { fgets(sin[i], sizeof(sin[0]), fp); //if (strcmp(sin, "NULL") == 0) { if (sin[i][0] == 0) { break; } } fclose(fp); printf("ASC or DESC: "); scanf(" %s", ad); if (strcmp(ad, "ASC") == 0) { qsort(sin,1000 , sizeof(sin[0]), cmp_u); if (sin[i][0] == 0) { break; } } else { qsort(sin, 1000, sizeof(sin[0]), cmp_d); if (sin[i][0] == 0) { break; } } for (i = 0;i < 1000;i = i + 1) { if (sin[i][0] == 0) { break; } printf("%s", sin[i]); } return 0; }

  • C言語のソートについて

    C言語で下記のファイルの中身を昇順と降順で出力しようとしているのですが、ソートが上手くいっていない状況です。 どなたか修正点を教えて頂けないでしょうか? 「ファイルの中身」 2022/11/14 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 2022/11/15 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/18 16:20:18 8+8,16.000000 2022/11/17 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 「ソースコード」 #include <stdio.h> #include <string.h> #include <stdlib.h> int cmp_u(const void* a, const void* d) { return *(char*)a - *(char*)d; } int cmp_d(const void* a, const void* d) { return *(char*)d - *(char*)a; } int main() { int r,i,n; FILE* fp; char sin[9][1000]; fp = fopen("log.txt", "r"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } for (i = 0; i < 9; i++) { fscanf(fp, "%s", &(sin[i])); } fclose(fp); printf("ASC or DESC: "); scanf(" %s", &ad); if (strcmp(ad, "ASC") == 0) { qsort(sin, 9, sizeof(char), cmp_u); } else { qsort(sin, 9, sizeof(char), cmp_d); } for (i = 0; i < 9; i++) { printf("%s\n", sin[i]); } return 0; }

  • C言語について

    以下のプログラムについてです test.txtから単語を読み込んでその異なる単語の数を求めるプログラムです。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stddef.h> #include<ctype.h> #define NMAX 80 #define LMAX 5000 void count(FILE*, int); void all_words(FILE *); FILE *fp, *fp2; char *fn="test.txt"; char *fn2="total word.txt"; const char *ignore="\n !?()*-;:.,_\"[]"; int main(void){ int p=0, x=0, c, l, t=0,k=0; char word3[LMAX][NMAX]; char word1[NMAX]; char word2[NMAX]; char *tp; char *tp2; if((fp=fopen(fn,"r"))==NULL){ printf("Can't open '%s'.\n",fn); return -1; } if((fp2=fopen(fn2,"w"))==NULL){ printf("Can't open '%s'.\n",fn2); return -1; } for(c=0;c<LMAX;c++){ if(fgets(word3[c],NMAX,fp)==NULL)break; p++; } for(c=0;c<p;c++){ for(x=0;x<NMAX;x++){ word1[x]=tolower(word3[c][x]); } tp=word1; while((tp2=strtok(tp,ignore))!=NULL){ if(*tp2=='\''){ if(*(tp2+1)=='`'){ t=1; } tp2++; } free(tp); strcpy(word2,tp2); k=l=strlen(word2)-1; if(word2[k]==('\'' & l)){ word2[l]='\0'; } if(word2[0] =='\'' &&t==0){ if(word2[1]!='\0'){ fputs(word2+1,fp2); fputc('\n',fp2); } } else{ if(word2[0]!='\0'){ fputs(word2,fp2); fputc('\n',fp2); } } tp=NULL; } } fclose(fp); fclose(fp2); all_words(fp2); return 0; } void all_words(FILE* fp2){ char word3[NMAX]; int n=0; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); return; } for(;;){ if(fgets(word3, NMAX,fp2)==NULL){ break; } n++; } fclose(fp2); count(fp2,n); } void count(FILE* fp2, int n){ int c, x, y=0; char *m=(char *)malloc(n*NMAX); char *xp; char *yp; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); free(m); return; } for(c=0,xp=m; c<n;c++,xp+=NMAX){ fgets(xp,NMAX,fp2); } qsort(m,n,NMAX,(int (*)(const void*, const void*))strcmp); c=1; for(x=0,xp=m,yp=m+NMAX;x<n-1;xp+=NMAX,yp+=NMAX,x++){ if(strcmp(xp,yp)==0){ y++; c++; } else{ c=1; } } printf("KIDN OF WORD:%d\n",n-y); free(m); fclose(fp2); } このプログラムについてメモリリークになってしまうのですが 確保していないメモリー領域に代入しているのが原因らしいのですが 具体的にどこを直せば良いのでしょうか? よろしくお願いします

  • C言語でループから抜けれない

    下記の課題に取り組んでおり、ソートは一回抜かしてファイルの読み込みに取り組んでいる状態です。 電卓アプリケーションの作成  以下の機能を満たすアプリケーションを作成してください。  ※画面の表示やログの形式は原則として例示されている内容に従ってください。  1) 四則演算が出来ること  2) コンソールから計算対象となる数値と演算子を受け取る    例) 5 + 6  3) 結果をコンソール上に表示する    例) 11  4) 演算結果と実行した日、時間、秒をログファイルとして保存する    ログの上限は1000行とする(上限を超過するケースはひとまず考慮しなくて良い)    例) log.txt に 以下の内容を記録      2015/04/27 14:30:51, 5 + 6, 11  5) コンソールからパラメータを受け取り、ログを実行時間の昇順/降順に並べ替えて    コンソールに表示する    例) ASC を入力      2015/04/26 10:20:00, 5 + 6, 11      2015/04/27 14:30:51, 7 - 6, 1      2015/04/27 15:30:00, 7 + 8, 15      2015/04/28 14:30:51, 8 + 9, 17    例) DESC を入力      2015/04/28 14:30:51, 8 + 9, 17      2015/04/27 15:30:00, 7 + 8, 15      2015/04/27 14:30:51, 7 - 6, 1      2015/04/26 10:20:00, 5 + 6, 11 しかしVisual studioでのデバックで for (i = 0;i < 1000;i=i+1) { fgets(sin[1000], sizeof(sin[0]), fp); if (strcmp(sin, "EOF") == 0) { break; } この行でループが抜け出せなくなってしまいました。 どこを修正すればいいえしょうか? #include <stdio.h> #include <time.h> #include <string.h> #include <stdlib.h> /* static char ad[10]; int cmp_u(const void* a, const void* d) { return strcmp((char*)a, (char*)d); } int cmp_d(const void* a, const void* d) { return strcmp((char*)d, (char*)a); } */ int main() { int num1, num2; char op; float answer; int r,i,n; FILE* fp; char c[11]; char sin[1000][1000]; char ad[8]; fp = fopen("log.txt", "a"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; }

専門家に質問してみよう