• 締切済み

動かないです

おかしなところが有ったらアドバイス・修正等お願いします。 うしろ3行を表示させたいです。 0~2行の場合はその分だけ表示させたいです。 # include <stdio.h> # include <stdlib.h> # include <string.h> char *getline(void) { char *buf = NULL; int size = 0; int oldsize; do { oldsize = size; size = size * 2 + 80; buf = realloc(buf, size + 1); if(!buf) { fprintf(stderr, "memory allocation failed\n"); exit(1); } if(!fgets(buf + oldsize, size + 1 - oldsize, stdin)) if(oldsize) break; else { free(buf); return NULL; } }while(strlen(buf + oldsize) == size - oldsize); return buf; } void scan(char **lines, int n_lines) { char *p; int i; for(i = 0; i < n_lines; i++) lines[i] = NULL; while(p = getline()) { free(lines[0]); for(i = 0; i < n_lines - 1; i++) lines[i] = lines[i+1]; lines[n_lines - 1] = p; } } void print(char **lines, int n_lines) { int i; for(i = 0; i < n_lines; i++) if(lines[i]) fputs(lines[i], stdout); } int main(void) { char *lines[3]; int i; scan(lines, 3); print(lines, 3); for(i = 0; i < 3; i++) free(lines[i]); return 0; }

みんなの回答

  • meruty
  • ベストアンサー率81% (9/11)
回答No.3

動かない原因が知りたいのでしたら、デバッグ実行(ステップ実行)してプログラムを1行ずつ動かし、次の行の結果がどうなるべきかという「あなたの予測」と、実際にどうなったかという「実際の結果」とを比較して、予想と結果が一致しない箇所を「あなた自身」が認識することが先決かと思います。 その上で、「私はこう考えたが、結果はこうだった。どこに問題があるのでしょうか?」と質問していただくと、回答者も答えやすいと思います。

  • ackapapa
  • ベストアンサー率44% (8/18)
回答No.2

# include <stdio.h> # include <stdlib.h> # include <string.h> char *getline(void) {   char *buf = NULL;   int size = 0;   int oldsize;   do     {       oldsize = size;       size = size * 2 + 80;       buf = realloc(buf, size + 1);       if(!buf)         {           fprintf(stderr, "memory allocation failed\n");           exit(1);         }       if(!fgets(buf + oldsize, size + 1 - oldsize, stdin)) ★         if(oldsize) ★       break; ★       else ★       {         free(buf);         return NULL;       }     }while(strlen(buf + oldsize) == size - oldsize);   return buf; } void scan(char **lines, int n_lines) {   char *p;   int i;   for(i = 0; i < n_lines; i++)     lines[i] = NULL;   while(p = getline())   {     free(lines[0]);     for(i = 0; i < n_lines - 1; i++)       lines[i] = lines[i+1];     lines[n_lines - 1] = p;   } } void print(char **lines, int n_lines) {   int i;   for(i = 0; i < n_lines; i++)     if(lines[i])   fputs(lines[i], stdout); ★ } int main(void) {   char *lines[3];   int i;   scan(lines, 3);   print(lines, 3);   for(i = 0; i < 3; i++)     free(lines[i]);   return 0; } ソースの構成を見たところ(処理内容は見ていません) ★の部分が明らかにおかしいですね あとmallocをしていないのにfreeをしている理由がわかりません。 mallocをした変数をfreeしていません。 またfreeを変数の先頭アドレスにせずポインタ毎に指定しているのもおかしいと思います。 1さんも指摘していますがfor内部の処理が1行であってもカッコを付けましょう。 malloc、freeの使い方をもっと知りましょう。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

ぱっと見。(処理までは見てない) ・この掲示板で作業依頼をしていること。 ・括弧の省略が危険。コーディングルールを検討した方がいい。 ・reallocでfree前のbufを失う危険性がある。(exitの問題ではなく、Cとしてよくない)

関連するQ&A

専門家に質問してみよう