C - 递归地将字符串从一个文件反转到另一个文件

时间:2013-02-27 02:46:08

标签: c string recursion reverse

我正在尝试使用递归转换为另一个文本文件中的文本文件中的字符串。反向字符串将存储在char数组中,缓冲区将成为该数组。然后缓冲区将被打印到新文件。这是我到目前为止所做的。

    #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>

        int
        reverse(char *ch, char *str)    //receives "buffer" as argument. str traverses ch
        {
            char array[20]; //will store the reversed string

            if(*str == '\0')
                return 0;   //arrived at end of string
            return(reverse(ch, str+1) + 1);      //don't know if this is correct
        }

//I want to use the returned number as the index number. For example, if I have
//string "abcd", string[0]='d', string[1]='c', string[2]='b', string[3]='a'. Problem is,
//how do I do it?


        int main(int argc, char *argv[])    //argv[1] is input file. argv[2] is output file printed backwards
        {   
            FILE *fp1, *fp2;
            char *p, buffer[20];    //p points to buffer

            fp1 = fopen("a.txt", "r");
            if(fp1 == NULL)
            {
                printf("The file does not exist.\n");
                return 0;
            }

            p = buffer;
            while(fgets(buffer, 20, fp1) != NULL)   //reads the first 20 characters of file.txt into buffer
            {
                reverse(buffer, p); //passes "buffer" as argument
                fprintf(fp2, "%s\n", buffer);
            }

            printf("File %s has been successfully reversed into file %s!\n", argv[1], argv[2]);
            fclose(fp1);
            fclose(fp2);
            return 0;
        }

由于我不熟悉递归,我对如何实现反向函数只有最微妙的想法。

1 个答案:

答案 0 :(得分:1)

通过迭代循环反转字符串更容易,更快,但要创建递归函数,您可以让函数反转起始和结束字符,然后使用较小的字符串重复该过程

abcde 
^   ^  first call
 ^ ^   next call
  ^    end

---

void reverse(char *s, char *e) {
  char tmp = *s;
  *s++ = *e;
  *e-- = tmp;
  if (e > s) reverse (s, e);
}

s 指向第一个字符, e 指向最后一个字符。请注意,初始字符串的长度必须大于&gt; 0(或者可以在函数中添加测试)。

为例

int main () {
    char x[] = "abcde";  
    reverse(x, x+strlen(x)-1);  
    printf("%s\n", x);  
    return 0;  
}  

输出edcba