我正在尝试编写一个小程序来反转文件中文本的前n个字符。我写了这个::
void getdata(FILE *fp)
{
char ch;
printf("Enter text::\n");
while((ch=getchar())!=EOF)
fputc(ch,fp);
}
void printdata(FILE *fp)
{
char ch;
while((ch=fgetc(fp))!=EOF)
putchar(ch);
}
void reverse(FILE *fp, int n)
{
char ch[20];
for( int i=0;i<n;++i)
ch[i]=fgetc(fp);
rewind(fp);
printf("%.*s\n",n,ch); //printing the string
while(n--)
fputc(ch[n-1],fp);
}
int main()
{
FILE *fp;
int n;
fp=fopen("music.txt","w+");
getdata(fp);
rewind(fp);
printf("Number of chars to reverse:: ");
scanf("%d",&n);
reverse(fp,n);
rewind(fp);
printf("After reversing text is::\n");
printdata(fp);
fclose(fp);
return 0;
}
输出是
我哪里错了?为什么会有'你'? 编辑:我可以通过用
替换while循环来实现它for( int i=0;i<n;++i)
fputc(ch[n-1-i],fp);
但是那时的错误是什么?
答案 0 :(得分:1)
你的故障是第一次循环递减n
。在您的用例n
中,请从4
开始,而不是5
。然后,您在n-1
分配了字符,这意味着n
必须从5
开始。最后,您的循环时间为4
而不是5
。
更改
while(n--)
fputc(ch[n-1],fp);
到
do
{
fputc(ch[n-1],fp);
}while(--n);
另一件小事。您的反向功能不是检查传递的n不能是&gt; ch长度,在你的情况下20。
答案 1 :(得分:0)
for( int i=0;i<n;++i) //consider n as 5
fputc(ch[n-1-i],fp);// ch[5-1-0] ch[5-1-1] ch[5-1-2] ...
不等于
while(n--) //consider n as 5
fputc(ch[n-1],fp); //ch[4-1] ch[3-1] ....
在while(n--)
之后的while循环中,当控制到达fputc(ch[n-1],fp)
时n已经递减。