最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言指針如何實(shí)現(xiàn)字符串逆序反轉(zhuǎn)

 更新時(shí)間:2022年07月20日 16:46:51   作者:xiaoyaolangwj  
這篇文章主要介紹了C語言指針如何實(shí)現(xiàn)字符串逆序反轉(zhuǎn),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

指針實(shí)現(xiàn)字符串逆序反轉(zhuǎn)

#include<stdio.h>
#include<string.h> 
 
void rec(char* arr)
{
	//int len = sizeof(arr);  // 判斷字符串長度需要用strlen。
	int len = strlen(arr);
	printf("字符串長度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;
}

知識點(diǎn)

  • 判斷字符串長度需要用到string.h下的strlen函數(shù)方法。
  • 算法層面:

逆序就是頭尾逐位交換,所以選定兩個(gè)指針,一個(gè)在首,一個(gè)在尾。

指針可以直接比較大小。所以才有了while(p1<p2)來將算法執(zhí)行的終點(diǎn)找到。

  • 因?yàn)閭魅牒瘮?shù)方法rec的是地址,所以可以直接修改了原始數(shù)據(jù)。為了如果為了保護(hù)原始數(shù)據(jù),需要復(fù)制一份另用。

字符串逆序的幾種寫法

提示:將字符串逆序與將其逆序打印出來是兩碼事,逆序是將內(nèi)容倒著改變了,逆序打印雖然打印結(jié)果也是倒著的,不過儲存字符串的數(shù)組內(nèi)容并沒有改變。

非遞歸寫法

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。

逆序思路為:將一字符串最左端與最右端的字符交換,交換過后,通過數(shù)組下標(biāo)將左邊第二個(gè)字符與右邊第二個(gè)字符交換,依次類推,知道數(shù)組下標(biāo)通過left++與right–,使得left>=right。

2. 自己輸入一串字符串,將其逆序

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[101] = { 0 };     //要給字符數(shù)組一定的內(nèi)存大小,如果寫成char arr[] = { 0 };,當(dāng)在給數(shù)組輸入的時(shí)候就會造成越界訪問。
	scanf("%s", arr);
	int sz = strlen(arr);    //在給定字符數(shù)組的大小為101的情況下,只能用strlen求輸入字符串長度。
                           //用sizeof(arr)/sizeof(arr[0])求出來的是數(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。

注意:對于自己給數(shù)組輸入數(shù)據(jù),再將其逆序這種情況下,在定義數(shù)組時(shí),要給字符數(shù)組一定的內(nèi)存大小。如果寫成char arr[] = { 0 };,說明這個(gè)數(shù)組的容量只有一個(gè)字節(jié),只能輸入一個(gè)字符,當(dāng)在給數(shù)組輸入的時(shí)候就會造成越界訪問。

3. 將逆序封裝成函數(shù)

#include <stdio.h>
#include <string.h>
void reverse(char arr[])
{
	
	int left = 0;
	int right = strlen(arr) - 1;      //封裝成函數(shù)只能用庫函數(shù)求字符串長度,不能用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 兩者用來求字符串長度時(shí)的場合區(qū)別。

這里值得注意的是,在自定義函數(shù)中求字符串長度時(shí),不要用sizeof(arr)/sizeof(arr[0])-1這種方式。直接使用庫函數(shù) strlen。因?yàn)閿?shù)組在傳參的時(shí)候,傳過去的是數(shù)組首元素的地址,也就是說形參雖說寫的是數(shù)組的形式char arr[],但是形參其實(shí)是個(gè)指針變量char*。

對于指針變量來說,其大小根據(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。

遞歸寫法

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ù)組,長度要大于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] 的位置上去。

注意:在第三步并沒有將放在臨時(shí)變量中的第一個(gè)字符直接往 str[n-1]上放,而是經(jīng)過第四步,將str[1] 與 str[n-2] 交換后,才將之前未交換完的第一個(gè)字符放到 str[n-1] 上去。原因:如果直接將 str[0] 與 str[n-1] 上的元素通過一個(gè)臨時(shí)變量交換了。那么對于即將要交換的 str[1] 與 str[n-2] 來說,他們與’\0’之間隔了一個(gè)放在str[n-1]上的第一個(gè)字符,str[1] 與 str[n-2] 也就無法通過首尾字符直接交換的方式進(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ù)要多,直接將首尾字符通過第三個(gè)臨時(shí)變量進(jìn)行交換就行。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++鍵盤記錄程序代碼

    C++鍵盤記錄程序代碼

    這篇文章主要介紹了C++鍵盤記錄程序代碼,是Windows應(yīng)用程序開發(fā)中非常實(shí)用的功能,該功能也常被一些遠(yuǎn)程操控程序所實(shí)用,需要的朋友可以參考下
    2014-10-10
  • c++ 虛函數(shù),虛表相關(guān)總結(jié)

    c++ 虛函數(shù),虛表相關(guān)總結(jié)

    這篇文章主要介紹了c++ 虛函數(shù),虛表的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-03-03
  • C語言實(shí)現(xiàn)掃雷游戲(初級版)

    C語言實(shí)現(xiàn)掃雷游戲(初級版)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)掃雷游戲初級版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C++中md5 算法實(shí)現(xiàn)代碼

    C++中md5 算法實(shí)現(xiàn)代碼

    在網(wǎng)上找了份c++ MD5的代碼,就簡單保存一下,需要的朋友可以參考下
    2017-07-07
  • 數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array實(shí)例詳解

    數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array實(shí)例詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語言動態(tài)內(nèi)存分配函數(shù)的實(shí)現(xiàn)

    C語言動態(tài)內(nèi)存分配函數(shù)的實(shí)現(xiàn)

    這篇文章主要介紹了C語言動態(tài)內(nèi)存分配函數(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • C++中sort函數(shù)的基礎(chǔ)入門使用教程

    C++中sort函數(shù)的基礎(chǔ)入門使用教程

    這篇文章主要給大家介紹了關(guān)于C++中sort函數(shù)的基礎(chǔ)入門使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2018-12-12
  • C/C++使用Zlib實(shí)現(xiàn)文件的壓縮與解壓

    C/C++使用Zlib實(shí)現(xiàn)文件的壓縮與解壓

    zlib 是一個(gè)開源的數(shù)據(jù)壓縮庫,旨在提供高效、輕量級的壓縮和解壓縮算法,本文將介紹如何使用 zlib 庫進(jìn)行數(shù)據(jù)的壓縮和解壓縮,以及如何保存和讀取壓縮后的文件,感興趣的可以了解下
    2023-11-11
  • C++11線程、互斥量以及條件變量示例詳解

    C++11線程、互斥量以及條件變量示例詳解

    這篇文章主要介紹了C++11線程、互斥量以及條件變量,C++11增加了線程以及線程相關(guān)的類,很方便地支持了并發(fā)編程,使得編寫多線程程序的可移植性得到了很大的提高,本文通過實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2023-03-03
  • VS+QT編譯環(huán)境中字符亂碼問題解決方法

    VS+QT編譯環(huán)境中字符亂碼問題解決方法

    編碼就是把?個(gè)字符編碼成二進(jìn)制碼存起來的方式,而解碼就是把這個(gè)二進(jìn)制碼按照原本編碼的規(guī)則還原成原來的字符,這篇文章主要介紹了VS+QT編譯環(huán)境中字符亂碼問題詳解,需要的朋友可以參考下
    2024-01-01

最新評論

长寿区| 新乡市| 巩留县| 丰台区| 右玉县| 南华县| 苍梧县| 宁城县| 安国市| 冀州市| 丰城市| 深水埗区| 民丰县| 泾川县| 修武县| 芜湖县| 宁陵县| 吉林市| 杂多县| 辉南县| 泸定县| 浑源县| 衡阳县| 潼关县| 柳河县| 嘉兴市| 中阳县| 固镇县| 阿拉善右旗| 中西区| 合江县| 夹江县| 当雄县| 濮阳县| 昆山市| 个旧市| 台中市| 惠东县| 涞源县| 登封市| 中西区|