将行转换为文件的问题

时间:2016-10-18 19:11:53

标签: c

此代码反向并将结果放入文件中,但不完全正确。 就像检测断路器或某些问题一样。这是一个例子:

来源:

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);
}

1 个答案:

答案 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