翻轉字串中的單詞順序
阿新 • • 發佈:2018-12-26
寫在前面的話:
- 馬上找工作了,小白要一點點記錄下自己走過的路。這是一個自己練手的題目,可能還存在很多bug需要改進。遇到的問題,呼叫strtok函式進行字串分割時候,發現只能返回被分割符分隔後的字串,分割符之前的單詞直接被截掉了。於是就自己寫了個查單詞的函式ReferWord,返回分割符之前的單詞的首地址,並保留擷取之後剩餘的字串,類似Linux下的include <string.h>庫中的strsep函式的功能。
- 程式還可以加些從console輸入字串的程式碼,待加。
要求:給定一個純字串(如:“I am a student”),翻轉過後變成(“student a am I”),單詞內部結構不變。
思路:首先,翻轉整個字串序,使之倒序排列;其次,再將翻轉後的單詞再倒序。
環境:Win10 eclipse C/C++
程式碼:
#include <stdio.h> #include <stdlib.h> #include <string.h> char *ReverseStr(char s[]) //將當前字串反翻轉 { char *p=s; int len=strlen(s); *(s+len+1)='\0'; char *t=s+len-1; int i=len/2; char tmp; while(i--) //將當前字串反翻轉 { tmp=*s; *s=*t; *t=tmp; s++; t--; } return p; } char* ReferWord(char *s,char (*Tmp)[20]) //查詢單詞 { char *p=s; int i=1; while(i) { p++; if(*p == ' '||*p == '\0') { i--; } } *p++=' '; memcpy(*Tmp,s,(p-s-1)); //儲存取出當前單詞後剩餘的字串 return p; //返回當前單詞的首地址 } char *ReverseWords(char *s,int cnt) //實現字串整句翻轉 { char *q=s; ReverseStr(s); //翻轉字串 printf("字串倒序:\n"); printf("%s\n",s); char Tmp[20]; //用於存放單詞 char STR[1000]; //用於存放翻轉後的字串 char *p=STR; char *t=STR; memset(STR,0,1000); while(cnt) { memset(Tmp,0,20); //必須清零,避免短單詞無法覆蓋長單詞,造成亂碼 q=ReferWord(q,&Tmp); //取單詞 ReverseStr(Tmp); //對單詞進行翻轉 memcpy(p,Tmp,strlen(Tmp)); p+=strlen(Tmp); *p++=' '; //當前單詞末尾補空格 cnt--; } STR[strlen(t)+1]='\0'; //對翻轉字串末尾加上結束符'\0' return t; //返回翻轉字串陣列的首地址 } int main(int argc,char **argv) { //setvbuf(stdout,NULL,_IONBF,0); char str[]="I am a student"; char *p=str; int cnt=0; printf("原始字串序:\n"); printf("%s\n",str); int len=strlen(str)+1; for(int j=0;j<len;j++) //查空格確定單詞數,單詞數=空格數+1 { if(*p++ == ' ') { cnt++; } } cnt++; p=NULL; p=ReverseWords(str,cnt); printf("翻轉字串序:\n"); printf("%s\n",p); return 0; }
執行結果:
字串改為"hello world"