簡體   English   中英

在C中遞歸地反轉一個字符串?

[英]Recursively reversing a string in C?

我必須在遞歸函數中反轉一個字符串,但我不能使用循環或strlen來查找字符串結尾的位置。 然后我必須將反向字符串傳遞回main並將其復制到新文件。 這是我到目前為止所擁有的:

int reverse(char *str, char *strnew, int p)
{
    char temp=str[p];
    if(temp=='\0' || temp=='\n')
    {
            strnew=str;
            return p;
    }
    else
    {
            reverse(str++, strnew, ++p);
            p--;
            strnew[p]=str[p];
            printf("strnew: %c\n",  strnew[p]);
            return 0;
    }
}



int main(int argc, char *argv[])
{
    FILE *fp;
    char buffer[100];
    char newstr[100];
    int pointer=0;
    fp=fopen("lab8.txt", "r");
    if(fp==NULL)
    {
            printf("Error opening file\n");
            return 0;
    }
    (fgets(buffer, 100, fp));
    reverse(buffer, newstr, pointer);
    printf("newstr: %s\n", newstr);
    FILE *fp2=fopen("lab8.2.txt", "w");
    fputs(newstr, fp2);
    fclose(fp);
    fclose(fp2);

    return 0;
}

我無法繞過如何扭轉字符串。 我找到了空字符使用p的位置,但是如何將字符串向后復制到新字符串上?

#include <stdio.h>

int reverse(char *str, int pos){
    char ch = str[pos];
    return (ch == '\0')? 0 : ((str[pos=reverse(str, ++pos)]=ch), ++pos);
}

int main(){
    char buffer[100];

    scanf("%99[^\n]", buffer);
    reverse(buffer, 0);
    fprintf(stdout, "%s\n", buffer);
    return 0;
}

由於這顯然是功課,沒有完整的解決方案,只有想法。

首先,您不需要將自己限制為一個遞歸函數。 你可以有幾個,並且strlen一個可靠的實現是微不足道的。 my_strlen(char *p)如果* p = 0則求值為0,否則求值為1 + my_strlen(p+1)

您也可以在單個遞歸循環中執行此操作,但您不必這樣做。

還有一件事:當你遞歸時,你可以在遞歸的前端和后端運行你的代碼。 遞歸就像一個循環; 但是在對self返回的嵌套調用之后,你有機會執行另一個循環,這個循環向后。 看看你是否可以利用它。

這很簡單。 輸入字符串時,將字符保存在您所在的位置。 遞歸地調用方法更多字符到右邊。 當你到達字符串的末尾時,你將有N個堆棧幀,每個幀包含一個N字符串的一個字符。 當您返回時,將字符寫回,但在返回時遞增指針,以便以相反的順序寫入字符。

我會盡力做到並給你一些示例代碼。 有一些解釋。

遞歸的優點在於您不需要知道字符串的長度,但字符串必須以null結尾。 否則,您可以為字符串長度添加參數。

您需要考慮的是最后一個輸入字符是您的第一個輸出字符,因此您可以一直遞歸到結尾,直到您到達字符串的末尾。 一旦到達字符串的末尾,就會開始將當前字符附加到輸出字符串(最初設置為空值)並將控制權返回給調用者,調用者隨后會將前一個字符附加到輸出字符串。

void reverse(char *input, char *output) {
    int i;
    if(*input) /* Checks if end of string */
        reverse(input+1,output); /* keep recursing */
    for(i=0;output[i];i++); /* set i to point to the location of null terminator */
    output[i]=*input; /* Append the current character */
output[i+1]=0; /* Append null terminator */
} /* end of reverse function and return control to caller */

最后,讓我們測試一下這個功能

int main(argc, argv) {
    char a[]="hello world";
    char b[12]="\0";
    reverse(a,b);
    printf("The string '%s' in reverse is '%s'\n", a, b);
}

產量

The string 'hello world' in reverse is 'dlrow olleh'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM