2017-09-04 60 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