0

我需要一个程序来反转存储在一个或多个文本文件中的所有字符串的顺序。这是我到目前为止所得到的:

#include <stdio.h>

main(int argc, char *argv[])
{
    int i;
    for (i=1;i < argc;i++)
    {
        FILE *MyFile=fopen(argv[i], "r");
        int i,len;
        char str[1000], *ptr;
        fgets(str, 1000, MyFile);
        ptr = str;
        for(i=0;i<1000;i++)
        {
            if(*ptr == '\0')  break;
            ptr++;
        }
        len = i;
        ptr--;
        for(i=len; i>0; i--)
        {
            printf("%c",*ptr--);
        }
        printf("\n");
        fclose (MyFile);
    }
    return 0;
}

我无法做的是正确循环程序,以便它反转所有字符串。目前它反转所有文件的第一个字符串,但是当它遇到换行符时 fgets 停止。我试图做的是计算当前文件中的行数,做一个 for 循环,最后做另一个fgets(str, 1000, MyFile);来推进 fgets,但我设法把事情搞砸了。

我想到的另一个选择是创建一个单独的函数,它只反转给定的字符串,并在主函数内部调用该函数适当的次数,但我不确定如何处理 argc 和 *argv[]情况。

有什么帮助吗?谢谢!

4

2 回答 2

1

将每个累积char在缓冲区中,直到检测到字符串结尾 ( \0)。然后反向打印。

printf_reverse(const char *buf, size_t len) {
  while (len > 0) {
    fputc(buf[--len], stdout);
  }
}

char buf[1000];
size_t len = 0;
int ch;
while ((ch == fgetc(MyFile)) != EOF) {
  if (ch == '\0') {
    printf_reverse(buf, len);
    len = 0;
  }
  // You may want not use EOL as part of the reverse
  else if (ch == '\n') {
    printf_reverse(buf, len);
    fputc(ch, stdout);
    len = 0;
  }
  else if (len < sizeof(buf)) {
    buf[len++] = ch;
  }
  else {
    ; // handle error string too long
  }
printf_reverse(buf, len);

OP 说“ABCD 1234 应该输出:DCBA 4321”。在 C 中,字符串以 a 结尾\0。不清楚源文件是否已嵌入\0或 OP 也想使用空格来指示字符串的结尾。

于 2013-10-28T02:55:37.950 回答
1
  • 您正在i用内部声明的另一个变量破坏外部循环的变量。这很可能是它不起作用的原因。
  • 您应该使用strlen()函数来获取字符串长度,而不是手动计算它。
  • 除非您保证最多有 1000 个字节的字符串,否则您应该考虑使用更智能的算法来满足更长的字符串。
于 2013-10-27T23:28:15.027 回答