2009-05-03 4 views
0

誰かがこのCコードをすばやく見て、コンパイラエラーが発生する理由を確認できますか?これは、カレンダー構造に詳細を入力するための関数であり、1つのノード、つまりカレンダーに1つの「イベント」を作成する必要があります。Cのカレンダー構造

struct event enter_key(void) 
{ 
     int day,month,year,starttime,endtime,length; 
     char* descp; 
    struct event* n; 

     printf("Enter Day:\n"); 
     scanf("%d", &day); 
     printf("Enter Month:\n"); 
     scanf("%d", &month); 
     printf("Enter Year: \n"); 
     scanf("%d", &year); 
     printf("Enter starttime:\n"); scanf("%d", &starttime); 
     printf("Enter endtime:\n"); 
     scanf("%d", &endtime); 
     printf("Enter Description: \n"); 
     scanf("%s", &descp); 


     n=mkevent(day, month, year, starttime, endtime, &descp); 

とき、私はこのメッセージを受け取っコンパイルしよう:

newpro.c:115:警告: 互換性のないポインタ型から 'mkevent' の 引数6を渡す

でした誰かが私にポインタを間違って宣言しているかどうか、あるいは 'descp'ポインタのためのスペースを割り当てるべきかどうか、あるいは間違った方法で構造体にノードを作成しようとしたことを教えてください。

読んでいただきありがとうございます。 C初心者。

+0

実際のコードをコピーして貼り付けてください。再入力しないでください。また、エラーメッセージが発生しているコード内のコメント –

答えて

2

ポインターは、ユーザーがscanf呼び出しで入力する値に十分な大きさのバッファーを指している必要があります。

%s  Matches a sequence of non-white-space characters; 
      the next pointer must be a pointer to char, and the 
      array must be large enough to accept all the 
      sequence and the terminating NUL character. The 
      input string stops at white space or at the maximum 
      field width, whichever occurs first. 

だから、それはあなたが可能ユーザーだけでなく、(バッファオーバーフローを引き起こすことができないと、文字列を読み取るための技術のいずれかを使用する必要があり、現実世界のコードで

char descp[ MAX_DESCRIPT ]; 

scanf("%s", descp); 

ものののようなものかもしれませんスペースを含む説明を入力する必要があります)。

私は間違った方法で構造内にノードを作成しようとしましたか?

descpに渡す私はmkeventの署名を知らないが、私はそれが説明ではなく、文字列へのポインタへのポインタとして文字列バッファ(const char*)へのポインタを取ることを期待したいです&descpではなく)。

0

このメッセージは、mkeventに異なるタイプのパラメータ(& descpの場所に)が必要であることを伝えます。

mkevent()に必要なものをもう一度確認してください。それはchar **ではありません。

おそらく、あなたはmkeventの行でdesc32をdescpに変更する必要があります。

1

descpは 'char to pointer'(char *)型です。違反行では、ポインタ自体のアドレス(char **)を渡しています。引数の前に '&'を削除します。

ああ、プロダクションコードでは特にscanf()を使用しないでください。バッファオーバーフローを起こす可能性があるため、境界チェックを行いません。

0

mkeventの宣言は表示されませんが、アドレスではなくdescを渡したいと思います。)

n=mkevent(day, month, year, starttime, endtime, descp); 
0

は私たちにmkeventの宣言を(与えるのに役立ちますが、あなたがdescpを渡すべきであるときは、& descpを渡しているので、それはおそらくより多くのです:あなたはおそらくしたい

n=mkevent(day, month, year, starttime, endtime, &descp); 

:あなたが持っています。