これを実行すると「フフフフ」がループしてします
どなかご教授ください。。
#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;
}
}
>fscanf(fp,"%c,%c",&name,&func)
%s ではないでしょうか?
>fscanf(fp,"%c,%c",&name,&func)
& は要らないです。
付けるのでした、&name[0],&func[0] です。
ありがとうございます、少し結果が変わりました
↓のエラーメッセージが出てしまいました。
問題が発生したため、c1009a.exe を終了します。
何処がいけないんでしょう・・・_|‾|○
head が、どこも参照していないからだと思います。
newは予約語なので、識別子には用いるべきではありません。
また、その実行時エラーはどこで発生していますか?
私の経験上「フフフフ」はcharに値が入ってない時に出るみたいです
違ってたらすいません
>>RAPTさん
エラーはすぐに出ます
プログラムの実行を押して、画面に何も文字がでず
このエラーがでます。newのままでも問題無いようです。
皆様の返信を参考にしてがんばってみます
> また、その実行時エラーはどこで発生していますか?
> エラーはすぐに出ます
いや、RAPTさんがおっしゃているのは、そのようなことではなく、
デバッグで先頭からステップ実行をした場合に、どの行を実行したときに、
エラーが発生するかということです。
> 私の経験上「フフフフ」はcharに値が入ってない時に出るみたいです
たしか、VCではデバッグモードで実行すると、未初期化の変数などが、
0xCCかなにかで初期化されるため、未初期化のcharの配列などの中身をみると、
「フフフフ」などと表示されたはずです。
元のプログラムは詳しく見ておりませんが、各メモリ(変数)の初期化などがされておらず、
不定なアドレスなどを参照していたりするのが原因でしょう。
先にも述べましたが、デバッグモードでステップ実行してながら、
各変数の値などもそれぞれ確認してみてください。
else tail->next= new;
ここでエラーが出ました、式の値は下の通りです。
- head 0x00430120
+ name 0x00430120 "abort"
+ func 0x00430130 "フフフフフフフフフフフフフフフフフフフフフフフフフフ"
+ next 0x00000000
- tail 0xc982bf82
+ func 0xc982bf92 ""
next CXX0030: Error: 式を評価できません
がんばってみます_|‾|○
>fscanf(fp,"%s,%s",name,func)
%s は、空白文字まで読むので、
name に、1 行を格納しようとし、配列のサイズを
オーバーしてしまうのが原因だと思います。
区切りを、スペースにするか、fgets() などで
1 行を読み込み、strtok() で , で区切るか
にすれば、どうでしょうか?
>>まきじさん
ありがとうございます、正常に動きました。
どうも助かりました。
補足:fscanfで書式指定文字列の精度を指定することも可能だと思います。
ツイート | ![]() |