C語言通過三步翻轉(zhuǎn)法實現(xiàn)單詞倒置詳解
一、解題思路
如何將一句話的單詞倒置,而標(biāo)點不倒置?
例如:I like beijing. 倒置成:beijing. like I
可以利用三步翻轉(zhuǎn)法,先將整句話倒置,再將每個單詞倒置。前面的例子中輸入的內(nèi)容有空格,如果使用 scanf() 函數(shù)的話,scanf 檢測到空格后就停止錄入了;所以要使用 gets() 函數(shù),gets 可以直接錄入一行,包括空格。

代碼示例:
可以看到 scanf() 函數(shù)讀取到空格就不讀了。

而 gets() 函數(shù)可以連空格一起讀入。

二、完整代碼與注釋
//將一句話的單詞進行倒置,標(biāo)點不導(dǎo)致。
//例如:I like BiJing. 倒置成BiJing. like I
#include<stdio.h>
#include<string.h>
void reverse(char* left, char* right)
{
while (left < right)
{
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
int main()
{
char arr[100] = { 0 };
//I like BiJing.
gets(arr);
//三步翻轉(zhuǎn)法
//1.字符串整體翻轉(zhuǎn)
// .gniJib ekil I
int len = strlen(arr);//求字符串長度
reverse(arr, arr + len - 1);
//2每個單詞翻轉(zhuǎn)
//BiJing. like I
char* strat = arr;//*strat指向數(shù)組首元素的地址
while (*strat)//*strat指向'\0'跳出循環(huán)
{
char* end = strat;//*end指向*strat指向的內(nèi)容
while (*end != ' ' && *end != '\0')
{
end++;
}
//逆序一個單詞
reverse(strat, end - 1);
if (*strat == ' ')//一個單詞倒置結(jié)束
{
strat = end + 1;
}
//整個字符串倒置結(jié)束
else
{
strat = end;
}
}
printf("%s\n", arr);
return 0;
}三、代碼剖析
1.實現(xiàn)字符串整體的翻轉(zhuǎn)

首先使用 strlen 求出字符個數(shù), 定義 reverse() 函數(shù)來進行倒置。使用指針訪問字符串最左端和最右端的字符,然后利用 temp 空變量進行三個值的交換,也就是倒置。
函數(shù)實現(xiàn)的代碼如下:
void reverse(char* left, char* right)
{
while (left < right)
{
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}2.一個單詞的翻轉(zhuǎn)

先定義一個 strat 指向字符串的第一個單詞,在定義一個 end 指向 strat 所指向的位置,也就是字符串的第一個單詞的地址。、

使用 while 循環(huán)判斷 end 指向的位置是不是空格或者 \0 ,如果 end 指向的位置不是 \0 ,就說明當(dāng)前字符串還未倒置完成, end 指向空格就說明當(dāng)前一個單詞倒置結(jié)束。當(dāng) end 不是指向空格的時候,end++ 就可以指向下一個位置,直至找到這一個單詞所有的字母,然后調(diào)用 reverse 進行倒置。

3.字符串中的每一個單詞的翻轉(zhuǎn)

我們可以倒置完一個單詞后利用 if 判斷 strat 指向的位置是不是空格,或者是不是 \0 。如果是空格就說明還有單詞未倒置,strat 就指向 end + 1的位置,這個位置就是下一個單詞首字母的位置;如果是 \0 就說明整個字符串的單詞已經(jīng)全部倒置完成,strat 就指向 end 的位置,也就是 \0的位置。

到此這篇關(guān)于C語言通過三步翻轉(zhuǎn)法實現(xiàn)單詞倒置詳解的文章就介紹到這了,更多相關(guān)C語言單詞倒置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VisualStudio2022不支持.NET Framework 4.0項目解決辦法
本文主要介紹了VisualStudio2022不支持.NET Framework 4.0項目解決辦法,文中通過圖文的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09
內(nèi)聯(lián)函數(shù)inline與宏定義深入解析
類的內(nèi)斂函數(shù)是一個真正的函數(shù)。使用內(nèi)聯(lián)函數(shù)inline可以完全取代表達式形式的宏定義2013-09-09
C語言數(shù)據(jù)的存儲超詳細講解中篇練習(xí)
使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么2022-04-04
深入探索C++中stack和queue的底層實現(xiàn)
這篇文章主要介紹了C++中的stack和dequeue的底層實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
C/C++產(chǎn)生隨機數(shù)函數(shù)簡單介紹
這篇文章主要為大家詳細介紹了C/C++產(chǎn)生隨機數(shù)函數(shù)的實現(xiàn)方法,如何使用C/C++產(chǎn)生隨機數(shù)函數(shù),感興趣的小伙伴們可以參考一下2016-04-04

