網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
指針實(shí)現(xiàn)字符串逆序反轉(zhuǎn)
#include<stdio.h>
#include<string.h>
void rec(char* arr)
{
//int len = sizeof(arr); // 判斷字符串長(zhǎng)度需要用strlen。
int len = strlen(arr);
printf("字符串長(zhǎng)度len = %d\n", len);
char* p1 = arr;
char* p2 = &arr[len - 1];
while (p1 < p2)
{
char temp = *p1;
*p1 = *p2;
*p2 = temp;
p1++;
p2--;
}
}
int main()
{
char arr[] = "hello world";
rec(arr);
printf("逆序之后輸出為:%s\n", arr);
system("pause");
return 0;
}
知識(shí)點(diǎn)
- 判斷字符串長(zhǎng)度需要用到string.h下的strlen函數(shù)方法。
- 算法層面:
逆序就是頭尾逐位交換,所以選定兩個(gè)指針,一個(gè)在首,一個(gè)在尾。
指針可以直接比較大小。所以才有了while(p1<p2)來(lái)將算法執(zhí)行的終點(diǎn)找到。
- 因?yàn)閭魅牒瘮?shù)方法rec的是地址,所以可以直接修改了原始數(shù)據(jù)。為了如果為了保護(hù)原始數(shù)據(jù),需要復(fù)制一份另用。
字符串逆序的幾種寫(xiě)法
提示:將字符串逆序與將其逆序打印出來(lái)是兩碼事,逆序是將內(nèi)容倒著改變了,逆序打印雖然打印結(jié)果也是倒著的,不過(guò)儲(chǔ)存字符串的數(shù)組內(nèi)容并沒(méi)有改變。
非遞歸寫(xiě)法
1. 將一個(gè)給定的字符串a(chǎn)bcdef逆序
#include <stdio.h>
int main()
{
char arr[] = "abcdef";
int sz = sizeof(arr) / sizeof(arr[0]); //求的是數(shù)組包含的元素個(gè)數(shù),'\0'也包括在內(nèi)
int left = 0;
int right = sz - 2; //減2是因?yàn)榍蟮玫膕z包含了'\0'這個(gè)元素。
while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
printf("%s", arr);
return 0;
}
打印結(jié)果為fedcba。
逆序思路為:將一字符串最左端與最右端的字符交換,交換過(guò)后,通過(guò)數(shù)組下標(biāo)將左邊第二個(gè)字符與右邊第二個(gè)字符交換,依次類推,知道數(shù)組下標(biāo)通過(guò)left++與right–,使得left>=right。
2. 自己輸入一串字符串,將其逆序
#include <stdio.h>
#include <string.h>
int main()
{
char arr[101] = { 0 }; //要給字符數(shù)組一定的內(nèi)存大小,如果寫(xiě)成char arr[] = { 0 };,當(dāng)在給數(shù)組輸入的時(shí)候就會(huì)造成越界訪問(wèn)。
scanf("%s", arr);
int sz = strlen(arr); //在給定字符數(shù)組的大小為101的情況下,只能用strlen求輸入字符串長(zhǎng)度。
//用sizeof(arr)/sizeof(arr[0])求出來(lái)的是數(shù)組大小,為101。
int left = 0;
int right = sz - 1;
while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
printf("%s", arr);
return 0;
}
隨便輸入一串字符,例如:12345gf,打印結(jié)果為fg54321。
注意:對(duì)于自己給數(shù)組輸入數(shù)據(jù),再將其逆序這種情況下,在定義數(shù)組時(shí),要給字符數(shù)組一定的內(nèi)存大小。如果寫(xiě)成char arr[] = { 0 };,說(shuō)明這個(gè)數(shù)組的容量只有一個(gè)字節(jié),只能輸入一個(gè)字符,當(dāng)在給數(shù)組輸入的時(shí)候就會(huì)造成越界訪問(wèn)。
3. 將逆序封裝成函數(shù)
#include <stdio.h>
#include <string.h>
void reverse(char arr[])
{
int left = 0;
int right = strlen(arr) - 1; //封裝成函數(shù)只能用庫(kù)函數(shù)求字符串長(zhǎng)度,不能用sizeof(arr)/sizeof(arr[0])-1這種方式。
//因?yàn)閿?shù)組形參就是個(gè)地址。sizeof(arr)與sizeof(arr[0])的大小都是四個(gè)字節(jié)或者八個(gè)字節(jié)。
while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse(arr);
printf("%s", arr);
return 0;
}
與sizeof 兩者用來(lái)求字符串長(zhǎng)度時(shí)的場(chǎng)合區(qū)別。
這里值得注意的是,在自定義函數(shù)中求字符串長(zhǎng)度時(shí),不要用sizeof(arr)/sizeof(arr[0])-1這種方式。直接使用庫(kù)函數(shù) strlen。因?yàn)閿?shù)組在傳參的時(shí)候,傳過(guò)去的是數(shù)組首元素的地址,也就是說(shuō)形參雖說(shuō)寫(xiě)的是數(shù)組的形式char arr[],但是形參其實(shí)是個(gè)指針變量char*。
對(duì)于指針變量來(lái)說(shuō),其大小根據(jù)編譯器環(huán)境,都是四個(gè)字節(jié)或者都是八個(gè)字節(jié)。sizeof運(yùn)算符就是獲取數(shù)據(jù)類型和表達(dá)式的尺寸的(單位:字節(jié))。sizeof(arr)與sizeof(arr[0])的大小都是四個(gè)字節(jié)或者八個(gè)字節(jié)。
所以sizeof(arr)/sizeof(arr[0])-1=4/4-1=0,或者8/8-1=0。
遞歸寫(xiě)法
1. 方法一
#include <stdio.h>
#include <string.h>
void reverse(char str[]) //用數(shù)組接收實(shí)參,也可用指針接收實(shí)參,如void reverse(char* str)
{
char tmp = *str;
int len = strlen(str);
*str = *(str + len - 1);
*(str + len - 1) = '\0';
if (strlen(str + 1) >= 2) //首尾交換后,剩下的元素構(gòu)成的數(shù)組,長(zhǎng)度要大于1,才逆序,只剩下一個(gè)元素,表明其是最中間的元素,放在原位就好。
{
reverse(str + 1);
}
*(str + len - 1) = tmp;
}
int main()
{
char arr[101] = { 0 };
scanf("%s", arr);
reverse(arr);
printf("%s\n", arr);
return 0;
}
思路:假設(shè)一個(gè)數(shù)組有 n 個(gè)元素。
交換str[0]與 str[n-1],再逆序 str[1] 與 str[n-2]
交換 str[1] 與 str[n-2],再逆序 str[2] 與 str[n-3]。依次類推
······
操作步驟:
- 1.先將第一個(gè)字符,即 str[0] 位置上的字符放在一個(gè)臨時(shí)變量中。
- 2.將最后一個(gè)元素交換到 str[0] 的位置去。
- 3.將字符串中的’\0’放到arr[n-1] 的位置上去。
- 4.此時(shí)從 str[1] 到 str[n-2] 的角度上看,是一個(gè)新的字符串,將 str[1] 與 str[n-2] 交換。
- 5.將先前放在臨時(shí)變量中的第一個(gè)字符賦給 arr[n-1] 的位置上去。
注意:在第三步并沒(méi)有將放在臨時(shí)變量中的第一個(gè)字符直接往 str[n-1]上放,而是經(jīng)過(guò)第四步,將str[1] 與 str[n-2] 交換后,才將之前未交換完的第一個(gè)字符放到 str[n-1] 上去。原因:如果直接將 str[0] 與 str[n-1] 上的元素通過(guò)一個(gè)臨時(shí)變量交換了。那么對(duì)于即將要交換的 str[1] 與 str[n-2] 來(lái)說(shuō),他們與’\0’之間隔了一個(gè)放在str[n-1]上的第一個(gè)字符,str[1] 與 str[n-2] 也就無(wú)法通過(guò)首尾字符直接交換的方式進(jìn)行交換了 。
逆序a b c d e f 等于交換 a與f ,再逆序b c d e
逆序b c d e 等于交換b與e,再逆序c d。依次類推。
2. 方法二
#include <stdio.h>
#include <string.h>
void reverse(char str[], int left, int right)
{
if (left < right)
{
char tmp = str[left];
str[left] = str[right];
str[right] = tmp;
reverse(str, left + 1, right - 1);
}
}
int main()
{
char arr[101] = { 0 };
scanf("%s", arr);
int left = 0;
int right = strlen(arr) - 1;
reverse(arr, left, right);
printf("%s\n", arr);
return 0;
}
方法二比方法一傳的參數(shù)要多,直接將首尾字符通過(guò)第三個(gè)臨時(shí)變量進(jìn)行交換就行。
原文鏈接:https://blog.csdn.net/xiaoyaolangwj/article/details/124291070
相關(guān)推薦
- 2022-11-26 詳解Python如何實(shí)現(xiàn)惰性導(dǎo)入-lazy?import_python
- 2022-12-23 C++?Boost?System超詳細(xì)講解_C 語(yǔ)言
- 2022-11-08 PostgreSQL長(zhǎng)事務(wù)與失效的索引查詢淺析介紹_PostgreSQL
- 2022-07-22 實(shí)現(xiàn)自定義HTTP服務(wù)器
- 2022-06-25 Python+matplotlib繪制條形圖和直方圖_python
- 2022-08-23 Python比較兩個(gè)日期的兩種方法詳解_python
- 2023-11-21 NVIDIA jetson nano/ Linux/ Ubuntu18.0.4 配置固定IP靜態(tài)IP
- 2022-05-17 MacOS下如何配置多JDK,配置Jdk 1.8 jdk 11和jdk17共同管理
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支