[英]Reverse a string recursively in C - using a pointer to string only
我正在嘗試使用遞歸和指向該字符串的單個指針來反轉字符串。
我的想法是從兩端遍歷字符串,提高指針並在字符串的末尾插入 '\\0's。 例如 - 給定一個字符串 'abcde\\0' - 在字符串中間替換“chars”,並在后面插入 '\\0' -> 遞歸調用 -> 當達到“停止條件”時,原始字符串應該是這樣的- 'edc\\0\\0\\0' - 一半的字符作為臨時變量存儲在堆棧中。 當返回並彈出堆棧時,這些字符應該以相反的順序覆蓋 '\\0'。 這就是想法。
到目前為止,這是我的代碼,但我無法讓它工作 - 請幫助我理解,我想念什么。 我在字符串中間有一個 '\\0' ,我不知道如何重寫它。 (我想這是主要問題)提前致謝。
#include <stdio.h>
#include <string.h>
void rev_str(char* _str);
int main()
{
char str[]="abcde";
puts("Str before:");
puts(str);
rev_str(str);
puts("Str after");
puts(str);
return 0;
}
void rev_str(char* _str)
{
int len=strlen(_str);
char temp=*_str;
if(len>1)
{
*_str = _str[len-1];
_str[len-1]='\0';
rev_str(++_str);
}
_str[len-1]=temp;
}
我不會調試你的代碼,但這可能會幫助你更好地理解——
http://www.programmingsimplified.com/c-program-reverse-string
來自頁面的示例 -
使用指針反轉字符串的C程序
現在我們將使用指針或不使用庫函數 strrev 來反轉字符串。
#include<stdio.h>
int string_length(char*);
void reverse(char*);
main()
{
char string[100];
printf("Enter a string\n");
gets(string);
reverse(string);
printf("Reverse of entered string is \"%s\".\n", string);
return 0;
}
void reverse(char *string)
{
int length, c;
char *begin, *end, temp;
length = string_length(string);
begin = string;
end = string;
for (c = 0; c < length - 1; c++)
end++;
for (c = 0; c < length/2; c++)
{
temp = *end;
*end = *begin;
*begin = temp;
begin++;
end--;
}
}
int string_length(char *pointer)
{
int c = 0;
while( *(pointer + c) != '\0' )
c++;
return c;
}
使用遞歸反轉字符串的C程序
#include <stdio.h>
#include <string.h>
void reverse(char*, int, int);
int main()
{
char a[100];
gets(a);
reverse(a, 0, strlen(a)-1);
printf("%s\n",a);
return 0;
}
void reverse(char *x, int begin, int end)
{
char c;
if (begin >= end)
return;
c = *(x+begin);
*(x+begin) = *(x+end);
*(x+end) = c;
reverse(x, ++begin, --end);
}
rev_str(++_str);
這就是問題。 您正在此處修改_str
,因此當您在最后執行_str[len-1]=temp
時,您正在寫入錯誤的位置。 將其更改為
rev_str(_str + 1);
只需更改代碼rev_str(++_str);
進入rev_str(_str+1);
. ++_str
等於_str += 1
,它會改變指針char *_str
。 但是_str+1
只會初始化formal param
,不會改變 'char *str'。 我希望這可以幫助你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.