1. 程式人生 > >劍指offer:翻轉字串

劍指offer:翻轉字串

題目:翻轉單詞順序

輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。為簡單起見,標點符號和普通字母同樣處理,例如:輸入 I am a student.  輸出: student. a am I

思路

①翻轉句子中所有字元,比如翻轉  I am a student. 結果是  .tneduts a ma I

②翻轉每個單詞中字元的順序  就得到了 student. a am I

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

void Reverse(char *pFront, char *pBack)
{
	if (pFront == NULL || pBack == NULL)
	{
		return;
	}
	while (pFront < pBack)//利用交換使字串逆序
	{
		char tmp = *pFront;
		*pFront = *pBack;
		*pBack = tmp;
		pFront++;
		pBack--;
	}
}

char *ReverseSentence(char *pSentence)
{
	if (pSentence == NULL)
	{
		return NULL;
	}
	char *pFront = pSentence;
	char *pBack= pSentence;//使後指標也指向整個字串第一個元素
	while (*pBack!= '\0')//pEnd等於‘\0’時退出
	{
		pBack++;
	}
	pBack--;//使後指標指向最後一個元素

	Reverse(pFront, pBack);//翻轉整個句子

	/*翻轉句子中每個單詞
	pFront指向單詞的第一個字元,pBack指向單詞的最後一個元素時,交換單詞內字元順序*/

	pFront = pBack = pSentence;
	while (*pFront != '\0')
	{
		if (*pFront== ' ')
		{
			pFront++;
			pBack++;
		}
		else if (*pBack == ' ' || *pBack == '\0')
		{
			pBack--;//使後指標指向當前單詞的最後一個元素
			Reverse(pFront,pBack);
			pBack++;//使後指標指向已經單詞的後一個位置
			pFront = pBack;//重新進入迴圈
		}
		else
		{
			pBack++;
		}
	}
	return pSentence;
}

int main()
{
	//char *Sentence = "I am a student";
	char Sentence[] = "I am a student";
	printf("%s\n", ReverseSentence(Sentence));
	return 0;
}

 vs2017用指標定義字串常量時:

定義時直接報錯,之前用其他編譯器這樣可以,百度,修改了一下設定,不提示這個錯誤了。

int main()
{
	char *Sentence = "I am a student";
	//char Sentence[] = "I am a student";
	printf("%s\n", ReverseSentence(Sentence));
	return 0;
}

執行程式時不列印,除錯時,出現下面的提示。

百度發現,改成下面這樣就可以了。

int main()
{
	//char *Sentence = "I am a student";
	char Sentence[] = "I am a student";
	printf("%s\n", ReverseSentence(Sentence));
	return 0;
}

解釋char *Sentence = "I am a student";

 "I am a student"這個字串被當作常量,放在記憶體靜態區,Sentence這個指標指向"I am a student”的首地址,這片記憶體是可讀不可寫的。除錯時,按繼續直接跳轉到這句。

 

跳轉到這句,因為這條語句試圖修改字串常量,所以出錯。

那為什麼用陣列定義的字串可以修改,而指標定義的不能修改?

因為定義為陣列的形式時,"I am a student"在棧區。