2017-03-06 9 views
-1

'fputs'の最初のインスタンスで次のプログラミングがクラッシュし、 'fname'をファイルMember_infに出力しようとしました。私も一定の文字列 "abcdefg"を印刷しようとしましたが、それでも失敗しました。正確に何が間違っていますか?それはファイルの初期化のようです。可能であれば、「fputs」問題を解決するのに役立つだけで、私は最初に自分自身で他のものを試してみたいと思います。fputsが私のプログラムをクラッシュさせています

#include<stdio.h> 
#include<dos.h> 
#include<time.h> 
#include<conio.h> 

FILE *Member_inf; 
FILE *Admin_inf; 
FILE *Book; 

void delay(unsigned int mseconds); 
struct meroDate 
{ 
    int mm,dd,yy; 
}; 
char *newlinestring(char t[]); 
int strilen(char t[]); 

int main(){ 

int choice,age,contact; 
char *member_fname=(char*)malloc(30); 
char *member_lname=(char*)malloc(30); 
char *fname=(char*)malloc(20); 
char *lname=(char*)malloc(20); 
char *address=(char*)malloc(60); 
do{ 
printf("\xB1\xB2\xB1\xB2\xB1\xB2\xB1\xB2\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1"); 
printf("\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1"); 
printf("\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB2\xB1\xB2\xB1\xB2\xB1"); 
printf("\xB2\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1 WELCOME TO THE ST. JAGO HIGH SCHOOL LIBRARY SYSTEM "); 
printf("\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1"); 
printf("\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1"); 
printf("\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1"); 
printf("\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1\n\n"); 

printf("\xDB\xDB\xDB\xDB\xB2 1:ADD MEMBER\n\n"); 
printf("\xDB\xDB\xDB\xDB\xB2 2:SEARCH EXISTING MEMBER\n\n"); 
printf("\xDB\xDB\xDB\xDB\xB2 3:EXIT\n\n"); 
printf("\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16"); 
printf("\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16"); 
printf("\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16"); 

     time_t t; 
    time(&t); 
     printf("Date and time:%s\n\n\n\n",ctime(&t)); 


printf("Please enter your choice: "); 
scanf("%d",&choice); 
system("cls"); 
printf("You chose option %d\n\n",choice); 
if (choice==3){ 
    printf("Thank you for visiting St. Jago High School Library. \n"); 
}else if(choice==1){ 
    printf("***************************** MEMBER REGISTRATION ******************************\n\n"); 
    printf("Please enter first name: \n"); 
    scanf("%s",&*fname); 
    printf("\nPlease enter last name: \n"); 
    scanf("%s",&*lname); 
    printf("\nPlease enter age: \n"); 
    scanf("%d",&age); 
    printf("\nPlease enter address: \n"); 
    scanf("%s",&*address); 
    printf("\nPlease enter contact number: \n"); 
    scanf("%d",&contact); 

    Member_inf=fopen("Members.txt","a");  

    fputs(fname,Member_inf);   <======== /*HERE HERE HERE*/ 
    fputs(lname,Member_inf); 
    fputs(age,Member_inf); 
    fputs(address,Member_inf); 
    fputs(contact,Member_inf); 

    fclose(Member_inf); 
}else if (choice==2){ 
    printf("***************************** MEMBER INFORMATION *******************************\n\n"); 
    printf("Please enter members first name: \n"); 
    scanf("%s",&member_fname); 
    printf("\nPlease enter members last name: \n"); 
    scanf("%s",&member_lname); 
    }else if (choice!=1,2,3){ 
    printf("wrong choice.Enter Again"); 
} 
system("cls"); 
}while(choice!=0); 


return 0; 
} 

void delay(unsigned int mseconds) 
{ 
    clock_t goal = mseconds + clock(); 
    while (goal > clock()); 
} 

char* newlinestring(char t[]){ 
    t[strilen(t)+1]='\0'; 
    return t; 
} 

int strilen(char t[]){ 
    int i; 
    for(i=0;t[i]!=NULL;i++){} 
    return i; 
} 
+2

最初の 'fputs'は' Member_inf = fopen( "Members.txt"、 "a"); 'の直後にあり、その成功はあなたがチェックしていません。 –

+0

'char * member_fname =(char *)malloc(30);'の代わりに、 'char member_fname [30];' –

+0

私は文字配列を作成しませんでした。なぜなら、私が文字ポインタを収集し、配列と比較することができないので、それらを比較する必要があるからです。 –

答えて

3
  1. malloc関数の結果をキャストしないでください。
  2. あなたはいつも(もちろん、これはすべての文字列の入力に適用されます)
  3. scanf("%s",&*fname);scanf("%s",fname);
    か、いっそのこと、fgets(fname);
    する必要があります(それがnullであってはならない)malloc関数の戻り値をテストする必要があります。アドバイスの

一言 - 関数は戻り値を持っている - それらを利用

scanf()使用を中止し、唯一fgets()を使用するようにfgets()手段を用いておよそEDIT
マイノート、better yet、。

+1

'fgets(fname、...);' scanf( "%d"、&choice); 'の後には、以前の入力関数とフォームから残された' \ n '塊 '" \ n "'の文字列です。すべての入力に 'fgets()'を使うのがベストです。 – chux

+1

@chux - 明確にします – KevinDTimm

+0

ああ、戻り値をテストする代わりに、文字通りファイルを作成したかどうかをチェックしただけで、はるかに簡単でした。私はあなたの助言を取り、フレットを使い始めるが、私が質問したところで(ファイルが作成されたことを知っていることを知っている) 'fputs(" abcdefg "、Member_inf)'しようとしたが、同様に –

0
  1. Member_infの値がNULLであるかどうかを確認して、ファイルが正常に開かれたかどうかを確認する必要があります。
  2. fputs(age,Member_inf); - fputsを使用してファイルに整数を書き込むことはできません。最初に文字列にキャストする必要があります(おそらくitoaを使用します)。
  3. for(i=0;t[i]!=NULL;i++){} - これは文字列の長さを取得する方法ではありません。誰も最後の文字がNULLであることを保証しません。さらに悪いことに、Microsoftのmsvcコンパイラを使用している場合、これはコンパイルされません。組み込みのstrlen機能を使用する必要があります。
+0

Heheはオリジナルであることを試みることについて話します。 –

+0

しかしNULLのテスト:scanfは常に最後の文字を\ nとして返しますか?その後、読み込みの試行がNULLを返すことを意味しますか?私はそれを元に戻す前に値から1を引いたものと仮定しています(\ nを無視します) –

+0

Fputs、ファイルの年齢を印刷しようとしたときにスリップしていました。 (fprintfを除いて)ファイルに何も印刷することができなくなって気を散らす。 –

関連する問題