2017-09-04 57 views
0

我正在嘗試將一個字符串寫入一個文件,然後讀取該字符串並輸出寫入該文件的字符串。 例如讀取時的錯誤輸出C中的文件

INPUT (Input Name) 
FalconHawk 

OUTPUT 
Hi FalconHawk! Have a great day! 

我的代碼是:

#include<stdio.h> 

void main(){ 

char n[10],r[1000]; 
FILE *fptr,*fpt; 

scanf("%s",n);      //Input name 

fptr=fopen("welcome.txt","w"); 
fprintf(fptr,"%s",n);     //Write to file 
fclose(fptr); 

fpt=fopen("welcome.txt","r"); 
fscanf(fpt,"%s",r);     
printf("Hi %s! Have a good day.",r); //Output file content 
fclose(fpt); 
} 

但由於某些原因,我越來越喜歡

INPUT (Input Name) 
FalconHawk 

OUTPUT 
HiHi FalconHawk! Have a great day! //"Hi" is getting printed two times 

輸出在與替換「你好」,「歡迎」我得到像

OUTPUT 
WelcomeWelcome FalconHawk! Have a great day! //"Welcome" is getting printed two times. 

是什麼導致這個問題?

+0

但是,現在它的輸出如下:Hi FalconHawk!祝你有個美好的一天!FalconHawk(名字在輸出結束時被打印) – FalconHawk

回答

0

您的緩衝區太小,並且沒有空間來終止字節,因此,您的代碼會調用未定義的行爲。如果你想讀的10個字符,那麼這就是你應該怎麼做

char input[11]; 
if (scanf("%10s", input) == 1) { 
    // Safely use `input' here 
} 

如果你想從標準輸入閱讀文本的整條生產線,然後使用fgets()代替

if (fgets(input, sizeof input, stdin) != NULL) { 
    // Safely use `input' here 
} 

中的字符串c總是需要一個額外的字節空間來存儲終止的'\0',請閱讀關於字符串的基本教程c瞭解他們如何工作以及如何對待他們。

+0

但是,現在它的輸出如下:Hi FalconHawk!祝你有個美好的一天!FalconHawk(名字在輸出結束時被打印出來) – FalconHawk

+0

@FalconHawk你需要顯式地清空輸出緩衝區,或者在'printf()'格式字符串的末尾添加'\ n'。 –

+0

我試過了,還是沒有運氣! – FalconHawk