1

別のテキスト ファイルへの再帰を使用して、テキスト ファイルから文字列を逆にしようとしています。反転された文字列は char 配列に格納され、buffer はその配列になります。buffer は新しいファイルに fprintf されます。これは私がこれまでに持っているものです。

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

私は再帰に慣れていないので、リバース関数を実装する方法についてはごくわずかなアイデアしかありません。

4

1 に答える 1

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は最後の文字を指します。最初の文字列の長さは 0 より大きい必要があることに注意してください (または関数にテストを追加できます)。

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

出力しますedcba

于 2013-02-27T06:01:54.397 に答える