フフフフになってしまいます

解決


 2005-06-30 23:04:08  No: 58127  IP: 192.*.*.*

これを実行すると「フフフフ」がループしてします
どなかご教授ください。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct list{
  char  name[16];//関数名
  char  func[100];//説明文
  struct list *next;
}NODE;

void list_out(NODE *);

NODE *head;

void main(void)
{
  FILE  *fp;
  NODE  *new,*tail;
  char  name[16],func[100];
  
  fp=fopen("関数.txt","r");
  if(fp == NULL){
    printf("ファイルをオープンできません!\n");
    exit(1);
  }

  tail = NULL;
  while((fscanf(fp,"%c,%c",&name,&func)!=EOF)){
    new = (NODE *)malloc(sizeof(NODE));//NODE型構造体のバイト数メモリ確保
    if(new == NULL){
      printf("メモリを確保できません!!\n");
      exit(1);
    }
    strcpy(new->name,name);//関数名のコピー
    strcpy(new->func,func);//説明文のコピー

    /*  ポインタのつなぎ換え*/
    new->next =  NULL;
    if(tail == NULL)  head= new; //リストが空なら
    else        tail->next= new;
    tail =  new;
  }

  fclose(fp);

  list_out(head);
}

void list_out(NODE *p)
{
  printf("関数名      説明文\n");
  while( p !=NULL ){
    printf("%-15s %s\n",p->name,p->func);
        p=p->next;
        }
}

編集 削除
まきじ  2005-06-30 23:27:03  No: 58128  IP: 192.*.*.*

>fscanf(fp,"%c,%c",&name,&func)

%s ではないでしょうか?

編集 削除
まきじ  2005-06-30 23:28:37  No: 58129  IP: 192.*.*.*

>fscanf(fp,"%c,%c",&name,&func)

& は要らないです。
付けるのでした、&name[0],&func[0] です。

編集 削除
 2005-06-30 23:30:57  No: 58130  IP: 192.*.*.*

ありがとうございます、少し結果が変わりました
↓のエラーメッセージが出てしまいました。
問題が発生したため、c1009a.exe を終了します。 

何処がいけないんでしょう・・・_|‾|○

編集 削除
まきじ  2005-06-30 23:36:22  No: 58131  IP: 192.*.*.*

head が、どこも参照していないからだと思います。

編集 削除
RAPT  2005-07-01 00:09:31  No: 58132  IP: 192.*.*.*

newは予約語なので、識別子には用いるべきではありません。
また、その実行時エラーはどこで発生していますか?

編集 削除
Nightz  2005-07-01 00:42:00  No: 58133  IP: 192.*.*.*

私の経験上「フフフフ」はcharに値が入ってない時に出るみたいです
違ってたらすいません

編集 削除
 2005-07-01 00:57:56  No: 58134  IP: 192.*.*.*

>>RAPTさん
エラーはすぐに出ます
プログラムの実行を押して、画面に何も文字がでず
このエラーがでます。newのままでも問題無いようです。

皆様の返信を参考にしてがんばってみます

編集 削除
KING・王  2005-07-01 07:57:17  No: 58135  IP: 192.*.*.*

> また、その実行時エラーはどこで発生していますか?

> エラーはすぐに出ます

いや、RAPTさんがおっしゃているのは、そのようなことではなく、
デバッグで先頭からステップ実行をした場合に、どの行を実行したときに、
エラーが発生するかということです。

> 私の経験上「フフフフ」はcharに値が入ってない時に出るみたいです
たしか、VCではデバッグモードで実行すると、未初期化の変数などが、
0xCCかなにかで初期化されるため、未初期化のcharの配列などの中身をみると、
「フフフフ」などと表示されたはずです。

元のプログラムは詳しく見ておりませんが、各メモリ(変数)の初期化などがされておらず、
不定なアドレスなどを参照していたりするのが原因でしょう。

先にも述べましたが、デバッグモードでステップ実行してながら、
各変数の値などもそれぞれ確認してみてください。

編集 削除
 2005-07-01 09:23:30  No: 58136  IP: 192.*.*.*

else  tail->next= new;

ここでエラーが出ました、式の値は下の通りです。

-  head  0x00430120
+  name  0x00430120 "abort"
+  func  0x00430130 "フフフフフフフフフフフフフフフフフフフフフフフフフフ"
+  next  0x00000000


-  tail  0xc982bf82
+  func  0xc982bf92 ""
  next  CXX0030: Error: 式を評価できません


がんばってみます_|‾|○

編集 削除
まきじ  2005-07-01 10:02:58  No: 58137  IP: 192.*.*.*

>fscanf(fp,"%s,%s",name,func)

%s は、空白文字まで読むので、
name に、1 行を格納しようとし、配列のサイズを
オーバーしてしまうのが原因だと思います。

区切りを、スペースにするか、fgets() などで 
1 行を読み込み、strtok() で , で区切るか
にすれば、どうでしょうか?

編集 削除
 2005-07-01 16:39:39  No: 58138  IP: 192.*.*.*

>>まきじさん
ありがとうございます、正常に動きました。
どうも助かりました。

編集 削除
RAPT  2005-07-02 02:33:32  No: 58139  IP: 192.*.*.*

補足:fscanfで書式指定文字列の精度を指定することも可能だと思います。

編集 削除