【问题标题】:Problems with reversing line into file [closed]将行反转为文件的问题[关闭]
【发布时间】:2016-10-18 19:11:52
【问题描述】:

此代码确实反转并将结果放入文件中,但并不完全正确。 比如,检测线路断路器或某事的一些问题。这是一个例子:

来源:

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

【问题讨论】:

  • 代码工作正常,但它倒转的线路太好了。正在发生的事情是换行符(\n)也被反转了,所以换行符被放置在每行的开头,但是“The quick brown fox...”没有换行符最后,这就是为什么第 2 行和第 3 行被挤在一起的原因。尝试使用\n 作为要反转的行尾。
  • 你不需要它,因为你在原地工作:begin=str+strlen(str)+1; *begin='\0'; 并且你添加了太多(没问题,因为缓冲区更大但仍然......)
  • 我个人会remove the newline that fgets puts in the buffer,然后在输出反转文本后换行。

标签: c


【解决方案1】:

几个 cmets/nitpicks,可能会也可能不会解决您的问题 :)

if (!str || !(*str))
    return NULL;

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

begin=str+strlen(str)+1; *begin='\0'; //??

应该不需要终止字符串,因为它已经终止了。

void main(void)

不,main() 返回一个 int。

while (!feof(fsrc))

这行不通。在测试 feof()/ferror() 之前,您需要做一些 IO。恕我直言,最好简单地循环 fgets()。

while (fgets(line, sizeof line, fsrc) {
     ...
 }

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

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

这是一个 sn-p,它用代码说明了我的 cmets。它不能解决所有问题,但应该足以让你继续前进。

#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

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2020-11-23
    • 1970-01-01
    • 2019-01-06
    • 2016-01-31
    • 2020-11-24
    相关资源
    最近更新 更多