C語(yǔ)言刷題之倒置字符串的解題全過(guò)程
先來(lái)看題

解題思路
?? 首先我們定義一個(gè)字符數(shù)組來(lái)存放字符串,然后用 gets函數(shù)來(lái)讀入字符串,接下來(lái)進(jìn)行處理階段,設(shè)計(jì)一個(gè)逆序函數(shù)逆序整個(gè)字符串,然后再逆序每個(gè)單詞,最后處理一下細(xì)節(jié)再輸出
解題過(guò)程
1.輸入
定義完一個(gè)字符數(shù)組后,因?yàn)?strong>scanf不吃空格符和換行符,所以這里輸入我們采用gets函數(shù)來(lái)進(jìn)行讀入字符串,看代碼??
int main()
{
char arr[101] = { 0 };
//輸入
gets(arr);
2.設(shè)計(jì)逆序函數(shù)
看代碼??
void reverse(char* left, char* right)
{
assert(*left != NULL);
assert(*right != NULL);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
??字符串的首尾元素逐個(gè)進(jìn)行交換(不包括\0)??
因?yàn)閭鬟^(guò)來(lái)的是數(shù)組首元素地址,所以我們要用指針變量來(lái)接收,為了代碼更謹(jǐn)慎,這里使用了assert斷言,防止遇到空指針而導(dǎo)致程序運(yùn)行錯(cuò)誤(不能忘記引頭文件<assert.h>)
3.逆序整個(gè)字符串
int len = strlen(arr); //逆序整個(gè)字符串 reverse(arr, arr + len - 1);
??我們使用strlen函數(shù)來(lái)計(jì)算字符串元素個(gè)數(shù)(不要忘記引頭文件<string.h>),然后調(diào)用 reverse函數(shù)進(jìn)行整個(gè)字符串的逆置。
??這里的 arr + len - 1是首元素地址+字符串長(zhǎng)度(整數(shù))- 1 得到的是末尾元素的地址(如果不 - 1指向的就是 ’\0‘了)
4.逆序每個(gè)單詞
char* cur = arr;
while (*cur)
{
//找一個(gè)單詞
char* start = cur;
while (*cur != ' ' && *cur != '\0')
{
cur++;
}
reverse(start, cur - 1);
if (*cur == ' ')
{
cur++;
}
}
??定義一個(gè)指針變量cur來(lái)接收逆序整個(gè)字符串之后的arr數(shù)組首元素地址,然后如果cur指向的字符不是’\0’的話(huà)就進(jìn)入循環(huán),然后再定義一個(gè)指針變量start來(lái)接收每個(gè)單詞的首元素地址,然后進(jìn)入循環(huán)判斷如果cur指向的不是空格或者’\0’就往后跳一個(gè)字符,直到cur指向的是空格或者’\0‘了,就說(shuō)明已經(jīng)遍歷完確認(rèn)了一個(gè)單詞,然后進(jìn)入reverse函數(shù) 來(lái)逆序單詞(cur - 1 是因?yàn)槿绻?-1,cur指向的是空格或者’\0‘)
??最后如果cur指向的是空格而不是’\0‘就說(shuō)明還沒(méi)有結(jié)束,還有單詞沒(méi)有逆序完,往后跳一個(gè)字符循環(huán)繼續(xù)
??最后打印輸出
源碼
#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* left, char* right)
{
assert(*left != NULL);
assert(*right != NULL);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[101] = { 0 };
//輸入
gets(arr);
//處理
int len = strlen(arr);
//逆序整個(gè)字符串
reverse(arr, arr + len - 1);
//逆序每個(gè)單詞
char* cur = arr;
while (*cur)
{
//找一個(gè)單詞
char* start = cur;
while (*cur != ' ' && *cur != '\0')
{
cur++;
}
reverse(start, cur - 1);
if (*cur == ' ')
{
cur++;
}
}
//打印
printf("%s\n", arr);
return 0;
}總結(jié)
到此這篇關(guān)于C語(yǔ)言刷題之倒置字符串的文章就介紹到這了,更多相關(guān)C語(yǔ)言倒置字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)
這篇文章主要介紹了C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)的相關(guān)資料,需要的朋友可以參考下2016-05-05
深入C++四種強(qiáng)制類(lèi)型轉(zhuǎn)換的總結(jié)
本篇文章是對(duì)C++中四種強(qiáng)制類(lèi)型轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語(yǔ)言修煉之路數(shù)據(jù)類(lèi)型悟正法?解析存儲(chǔ)定風(fēng)魔上篇
使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類(lèi)型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類(lèi)型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么2022-02-02
C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線(xiàn)程池的示例代碼
本文主要介紹了C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線(xiàn)程池的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
C++實(shí)現(xiàn)打印虛函數(shù)表的地址
對(duì)于存在虛函數(shù)的類(lèi),如何打印虛函數(shù)表的地址,并利用這個(gè)虛函數(shù)表的地址來(lái)執(zhí)行該類(lèi)中的虛函數(shù)呢,下面小編就來(lái)和大家一起簡(jiǎn)單聊聊吧2023-07-07
C語(yǔ)言深入探究自定義類(lèi)型之結(jié)構(gòu)體與枚舉及聯(lián)合
今天我們來(lái)學(xué)習(xí)一下自定義類(lèi)型,自定義類(lèi)型包括結(jié)構(gòu)體、枚舉、聯(lián)合體,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考2022-05-05
C語(yǔ)言深入講解語(yǔ)句與選擇結(jié)構(gòu)的使用
這篇文章主要為大家介紹了C語(yǔ)言的語(yǔ)句與選擇結(jié)構(gòu),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05

