此代码反向并将结果放入文件中,但不完全正确。 就像检测断路器或某些问题一样。这是一个例子:
来源:
This is a line.
This is another line.
Quick brown fox jumps over a lazy dog!
结果:
(blank line)
.enil a si sihT
.enil rehtona si sihT!god yzal a revo spmuj xof nworb kciuQ
#include <stdio.h>
#include <string.h>
char *reverse (char *str)
{
char *begin, *end, c;
if (!str || !(*str))
return NULL;
for (begin=str, end=str+strlen(str)-1; begin<end; begin++, end--)
{
c=*begin;
*begin=*end;
*end=c;
}
begin=str+strlen(str)+1; *begin='\0'; //??
return str;
}
void main(void)
{
char line[1000];
FILE *fsrc, *frslt;
fsrc=fopen("source.txt", "r");
if (fsrc==NULL) return;
frslt=fopen("result.txt", "w");
while (!feof(fsrc))
{
fgets (line, 1000, fsrc);
fputs (reverse(line), frslt);
}
fclose(fsrc);
fclose(frslt);
}
答案 0 :(得分:3)
一些评论/挑剔,可能会或可能不会解决您的问题:)
if (!str || !(*str))
return NULL;
不要这样做。不要在空字符串上返回NULL,fputs()将为barf。根据我的经验,a)最好断言str指针是非空的,b)返回空字符串。
begin=str+strlen(str)+1; *begin='\0'; //??
应该没有必要终止字符串,因为它已经终止。
void main(void)
Nah,main()返回一个int。
while (!feof(fsrc))
这不会奏效。在测试feof()/ ferror()之前,你需要做一些IO。恕我直言,只需循环fgets()即可。
while (fgets(line, sizeof line, fsrc) {
...
}
最好放弃输入和输出文件,只需从stdin读取并写入stdout,至少在测试时。您尝试实现的功能已在UNIX shell(man rev)中提供。使用stdin / stdout可以更轻松地测试结果并将结果与rev。
的结果进行比较另外,请记住fgets()不会从字符串中删除\ n。输入像&#34; foo \ n&#34;成为&#34; \ noof&#34;,这可能不是你想要的。
这是一段代码,用于说明我在代码中的评论。它并没有解决所有问题,但应该足以让你前进。
#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char *str)
{
char *begin, *end, c;
size_t n;
assert(str != NULL);
n = strlen(str);
if (n == 0)
return;
for (begin = str, end = str + n - 1; begin < end; begin++, end--) {
c = *begin;
*begin = *end;
*end = c;
}
}
int main(void)
{
char line[1000];
while (fgets(line, sizeof line, stdin)) {
reverse(line);
fputs(line, stdout);
}
}
HTH