C 将行反转到文件中的问题

C 将行反转到文件中的问题,c,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 #包括 #包括 字符*反向(字符*str) {

此代码会将结果反转并放入文件中,但不完全正确。 比如,检测线路断路器或其他问题。以下是一个示例:

资料来源:

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
#包括
#包括
字符*反向(字符*str)
{
字符*开始,*结束,c;
如果(!str | |!(*str))
返回NULL;

对于(begin=str,end=str+strlen(str)-1;begin一些评论/吹毛求疵,它们可能解决您的问题,也可能解决不了您的问题:)

不要这样做。不要在空字符串上返回NULL,fputs()会呕吐。根据我的经验,最好是a)断言str指针为非NULL,b)返回空字符串

begin=str+strlen(str)+1; *begin='\0'; //??
应该不需要终止字符串,因为它已经终止

void main(void)
不,main()返回一个int

while (!feof(fsrc))
这行不通。在测试feof()/ferror()之前,您需要执行一些IO。因此,最好在fgets()上循环

至少在测试时,删除输入和输出文件,简单地从stdin读取并写入stdout可能是一个好主意。您尝试实现的功能已经在UNIX shell(man rev)中可用。使用stdin/stdout可以更轻松地测试结果,并将结果与rev的结果进行比较

另外,请记住fgets()不会从字符串中删除\n。像“foo\n”这样的输入会变成“\noof”,这可能不是您想要的

下面是一个用代码说明我的注释的片段。它并不能解决所有问题,但应该足以让您继续

#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);
    }
}
#包括
#包括
#包括
无效反向(字符*str)
{
字符*开始,*结束,c;
尺寸;
断言(str!=NULL);
n=strlen(str);
如果(n==0)
返回;
对于(begin=str,end=str+n-1;begin

HTH

代码运行正常,但它将行反转得太好。发生的情况是,新行馈送(
\n
)也在反转,因此新行馈送被放置在每行的开头,但“快速棕色狐狸…”结尾没有换行符,因此第2行和第3行被重叠在一起。尝试使用
\n
作为要反转的行的结尾。您不需要换行符,因为您正在原地工作:
begin=str+strlen(str)+1;*begin='\0';
并且您添加了太多(没有问题,因为缓冲区更大,但仍然..)就我个人而言,我会这样做,然后在输出反向文本后输出一个换行符。
while (!feof(fsrc))
while (fgets(line, sizeof line, fsrc) {
     ...
 }
#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);
    }
}