gpt4 book ai didi

c - 将行反转到文件中时出现问题

转载 作者:行者123 更新时间:2023-11-30 21:47:44 25 4
gpt4 key购买 nike

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

来源:

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

最佳答案

一些评论/挑剔,可能会也可能不会解决您的问题:)

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) {
...
}

删除输入和输出文件,并简单地从 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);
}
}

HTH

关于c - 将行反转到文件中时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40116220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com