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

解決


  2005-07-01 08:04:08  No: 58127

これを実行すると「フフフフ」がループしてします
どなかご教授ください。。
#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-07-01 08:27:03  No: 58128

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

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


まきじ  2005-07-01 08:28:37  No: 58129

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

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


  2005-07-01 08:30:57  No: 58130

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

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


まきじ  2005-07-01 08:36:22  No: 58131

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


RAPT  2005-07-01 09:09:31  No: 58132

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


Nightz  2005-07-01 09:42:00  No: 58133

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


  2005-07-01 09:57:56  No: 58134

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

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


KING・王  2005-07-01 16:57:17  No: 58135

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

> エラーはすぐに出ます

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

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

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

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


  2005-07-01 18:23:30  No: 58136

else  tail->next= new;

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

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

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

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


まきじ  2005-07-01 19:02:58  No: 58137

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

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

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


  2005-07-02 01:39:39  No: 58138

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


RAPT  2005-07-02 11:33:32  No: 58139

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加