日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编写字符串反转函数 .

發布時間:2024/1/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编写字符串反转函数 . 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先用數組下標的形式實現:

提供三種方法:

??? 1、有中間變量

??? 2、無中間變量

??? 3、堆棧實現

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

??? void reverse_str(char * ch);
??? void reverse_str2(char *ch);

??? int main(void)
??? {
?????? char c[] = "Can you reverse me?";

?????? printf("original string c: /n%s/n", c);
?????? reverse_str(c);
?????? printf("reversed string after calling reverse_str: /n%s/n", c);
?????? reverse_str2(c);
?????? printf("reversed string after calling reverse_str2: /n%s/n", c);
?????? system("pause");

?????? return 0;
??? }

??? void reverse_str(char *ch)? /*使用中間變量*/
??? {
?????? int len;
?????? int i;
?????? len = strlen(ch)-1;
?????? char ctemp;

?????? for(i = 0; i < len-i; i++)
?????? {
???????????? ctemp = ch[i];
???????????? ch[i] = ch[len-i];
???????????? ch[len-i] = ctemp;
?????? }
?????? ch[len+1] = 0;

??? }

-------------------------------------------------------

??? void reverse_str2(char *ch)?? /*不用中間變量*/
??? {
?????? int len;
?????? int i;
?????? len = strlen(ch)-1;
?????? char ctemp;

?????? for(i = 0; i < len-i; i++)
?????? {
???????????? ch[i] = ch[i] ^ ch[len-i];
???????????? ch[len-i] = ch[i] ^ ch[len-i];
???????????? ch[i] = ch[i] ^ ch[len-i];
?????? }
?????? ch[len+1] = 0;
??? }

---------------------------------------------------------

?

//堆棧實現

我沒有記錯的話是一道MSN的筆試題,網上無意中看到的,拿來做了一下。題目是這樣的,給定一個字符串,一個這個字符串的子串,將第一個字符串反轉,但保留子串的順序不變。例如:
輸入: 第一個字符串: "This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn"
子串: "zhuxinquan"
輸出: "nc/moc.zhuxinquan.www//:ptth :etis esenihC s'zhuxinquan si sihT"
一般的方法是先掃描一邊第一個字符串,然后用stack把它反轉,同時記錄下子串出現的位置。然后再掃描一遍把記錄下來的子串再用stack反轉。我用的方法是用一遍掃描數組的方法。掃描中如果發現子串,就將子串倒過來壓入堆棧。
最后再將堆棧里的字符彈出,這樣子串又恢復了原來的順序。源代碼如下:

#include <iostream> #include <cassert> #include <stack> using namespace std; //reverse the string 's1' except the substring 'token'. const char* reverse(const char* s1, const char* token) {assert(s1 && token);stack<char> stack1;const char* ptoken = token, *head = s1, *rear = s1;while (*head != '/0'){while(*head!= '/0' && *ptoken == *head){ptoken++;head++;}if(*ptoken == '/0')//contain the token{const char* p;for(p=head-1;p>=rear;p--)stack1.push(*p);ptoken = token;rear = head;}else{stack1.push(*rear);head=++rear;ptoken = token;}}char * return_v = new char[strlen(s1)+1];int i=0;while(!stack1.empty()){return_v[i++] = stack1.top();stack1.pop();}return_v[i]='/0';return return_v; } int main(int argc, char* argv[]) {cout<<"This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn/n";cout<<reverse("This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn","zhuxinquan");return 0; } 以下是用指針實現: 題目: ??????? 編寫函數reverse_string,它的原型如下:void reverse_string(char *str);函數把參數字符串中的字符串反向排列。請使用指針而不是數組下標,不要使用任何C函數庫中用于操縱字符串的函數。提示:不要聲明一個局部數組來臨時存儲參數字符串。算法: ?????? 關于反轉字符串的方法很多。這里我給出我想到的一種算法。 /************反轉字符串************/ void?reverse_str(char?*str) { ????char?*cp?=?str; ????int?i=0; ????while(*str!=?'/0') ???? { ????????str++; ????????i++; ????} ????i?/=?2; ????str--; ????while(i--?>?0) ???? { ????????*str?^=?*cp; ????????*cp?^=?*str; ????????*str?^=?*cp; ????????str--; ????????cp++; ????} } 說明:算法中運用了:a ^ a = 0? 和 a ^ 0 = a 的特性。以此來進行變量值的交換,可以避免使用額外的臨時變量 另外C標準字符串反轉函數strrev 原型:extern char *strrev(char *s);   用法:#include <string.h>   功能:把字符串s的所有字符的順序顛倒過來(不包括空字符NULL)。   說明:返回指向顛倒順序后的字符串指針。   舉例:   // strrev.c   #include <syslib.h>   #include <string.h>   main()   {   char *s="Welcome To Beijing";   clrscr();   textmode(0x00); // 6 lines per screen   printf("%s/n%s",s,strrev(strdup(s)));   getchar();   return 0;   }

總結

以上是生活随笔為你收集整理的编写字符串反转函数 .的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。