1. 程式人生 > >翻轉字串中的單詞順序

翻轉字串中的單詞順序

寫在前面的話:

  • 馬上找工作了,小白要一點點記錄下自己走過的路。這是一個自己練手的題目,可能還存在很多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"