簡體   English   中英

使用遞歸反轉字符串

[英]string reverse using recursion

有人可以告訴我我的代碼有什么問題嗎? 它顯示了一些奇怪的輸出。

#include<stdio.h>
#include<string.h>
void reverse(char string[])
{
    char b[200];
    int t;
    t = strlen(string);
    if (t==1)
        printf("%c",string[0]);
    else
    {
        printf("%c",string[t-1]);
        for (int i=0;i<t-1;i++)
            b[i]=string[i];
        reverse(b);
    }
}
int main()
{
    char a[200];
    scanf("%s",&a);
    reverse(a);
    return 0;
}

如果您曾嘗試使用調試器,您會看到t在第二次迭代中變得瘋狂。 這是因為在將string復制到b您忘記在末尾插入\\0符號(索引位置為t-1 )。 這會導致t在下一次迭代中變成任何東西,因為strlen()需要一個以空字符結尾的字符串,並且會導致文檔中提到的未定義行為

如果 str 不是指向空終止字節字符串的指針,則行為未定義

因此,快速修復如下:

...
for (int i=0;i<t-1;i++)
{
    b[i]=string[i];
}
b[t-1] = '\0';
reverse(b);
...

正如@LPs 在評論中已經提到的:更改scanf("%s",&a); scanf("%199s",a); (199 因為我們需要在最后為 '\\0' 留一個空格,感謝@RoadRunner 注意到這一點)

注意:查看strncpy_s (如果您使用 C11)並使用它而不是for循環:

printf("%c",string[t-1]);
strncpy_s(b, 200, string, t-1);       // 200 because char b[200]
reverse(b);

strncpy

printf("%c",string[t-1]);
strncpy(b, string, t-1); 
b[t-1] = '\0';
reverse(b);

還有一種方法是不復制:

else
{
    string[t-1] = '\0';    // you don't need array 'b' at all
    reverse(string);
}

最簡單的方法就是使用循環:

for (int i = strlen(string) - 1; i >= 0; --i)
{
    printf("%c", string[i]);
}

使用遞歸反轉字符串的最簡單方法是這樣的:

 // C++ program to reverse a string using recursion # include <stdio.h> # include<string> using namespace std; string in=""; /* Function to print reverse of the passed string */ void reverse(char *str) { if (*str) { reverse(str+1); in=in+*str; /* If you want to save the reversed string */ printf("%c", *str); /*If you just want to print the reversed string */ } } /* Driver program to test above function */ int main() { char a[] = "Reversing a string using recursion"; reverse(a); printf("\\n%s\\n",in.c_str()); return 0; } /* output : noisrucer gnisu gnirts a gnisreveR */

解釋:

遞歸函數(反向)將字符串指針 (str) 作為輸入,並使用傳遞指針 (str+1) 的下一個位置調用自身。 遞歸繼續這樣,當指針到達'\\0'時,堆棧中累積的所有函數在傳遞的位置(str)打印char並一一返回。

Time Complexity: O(n)

您在一個函數中混合了兩種方法,即遞歸和循環。 此外,對我來說,仍然不清楚是要將輸入字符串更改為相反的順序,還是只想以相反的順序打印出來。 無論如何,請參閱提供基於循環的反向打印和基於遞歸的反向打印的解決方案; 希望它有助於理解代碼所經歷的步驟:

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

void reverse_loop(char string[]) {
    long i = strlen(string) - 1;
    while (i >= 0)
        printf("%c",string[i--]);
}

void reverse_recursive (char string[]) {
    if (string[0] != '\0') {
        reverse_recursive(&string[1]);
        printf("%c", string[0]);
    }
}

int main()
{
    char a[200] = { "some test string" };
    reverse_recursive(a);
    return 0;
}

暫無
暫無

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

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