反转多个文件的所有字符串

时间:2013-10-27 23:19:54

标签: c string pointers reverse

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

#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,但我不知何故设法搞砸了。

我想到的另一个选项是创建一个单独的函数,它只反转一个给定的字符串,并在main函数调用中运行适当的次数,但我不知道如何处理argc和* argv [ ]在这种情况下。

有任何帮助吗?谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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中,字符串以\0结尾。目前尚不清楚源文件是否嵌入了\0,或者OP也希望使用空格来指示字符串的结尾。