2017-03-06 26 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 [30];'而不是'char * member_fname =(char *)malloc(30);'? –

+0

我沒有製作字符​​數組,因爲當我使用fgets時,我將收集一個字符指針,並且我無法將它與數組進行比較,是的,我需要對它們進行比較。 –

回答

3
  1. 不要投malloc的結果。
  2. 應始終測試的malloc的返回值(它不能爲空)
  3. scanf("%s",&*fname);應該scanf("%s",fname);
    或者更好的是,fgets(fname);
    (顯然,這適用於所有的字符串輸入)。建議

一個字 - 函數有返回值 - 利用它們

編輯
我注意到,better yet,關於使用fgets()意味着停止使用scanf()和只使用fgets()

+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

說說試圖原創。 –

+0

但測試爲NULL:不scanf函數總是返回的最後一個字符爲\ n嗎?那意味着任何讀取嘗試將返回一個NULL?我應該減一的值才返回它最初(忽略\ n)的 –

+0

FPUTS,當我嘗試打印時代到文件是一個滑了起來,我會固定它的視線,如果我不是由於不能打印任何內容到文件(除了fprintf中) –