劍指offer:翻轉字串
阿新 • • 發佈:2018-12-31
題目:翻轉單詞順序
輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。為簡單起見,標點符號和普通字母同樣處理,例如:輸入 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"在棧區。