中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言指針怎么實現字符串逆序反轉

發布時間:2022-07-21 09:47:52 來源:億速云 閱讀:156 作者:iii 欄目:開發技術

本篇內容介紹了“C語言指針怎么實現字符串逆序反轉”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

指針實現字符串逆序反轉

#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;
}

知識點

  • 判斷字符串長度需要用到string.h下的strlen函數方法。

  • 算法層面:

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

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

  • 因為傳入函數方法rec的是地址,所以可以直接修改了原始數據。為了如果為了保護原始數據,需要復制一份另用。

字符串逆序的幾種寫法

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

非遞歸寫法

1. 將一個給定的字符串abcdef逆序

#include <stdio.h>
int main()
{
	char arr[] = "abcdef";
	int sz = sizeof(arr) / sizeof(arr[0]); //求的是數組包含的元素個數,'\0'也包括在內
	int left = 0;
	int right = sz - 2;   //減2是因為求得的sz包含了'\0'這個元素。
	while (left < right)
	{
		char tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
	printf("%s", arr);
	return 0;
}

打印結果為fedcba。

逆序思路為:將一字符串最左端與最右端的字符交換,交換過后,通過數組下標將左邊第二個字符與右邊第二個字符交換,依次類推,知道數組下標通過left++與right&ndash;,使得left>=right。

C語言指針怎么實現字符串逆序反轉

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

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

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

3. 將逆序封裝成函數

#include <stdio.h>
#include <string.h>
void reverse(char arr[])
{
	
	int left = 0;
	int right = strlen(arr) - 1;      //封裝成函數只能用庫函數求字符串長度,不能用sizeof(arr)/sizeof(arr[0])-1這種方式。
                                    //因為數組形參就是個地址。sizeof(arr)與sizeof(arr[0])的大小都是四個字節或者八個字節。
	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 兩者用來求字符串長度時的場合區別。

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

對于指針變量來說,其大小根據編譯器環境,都是四個字節或者都是八個字節。sizeof運算符就是獲取數據類型和表達式的尺寸的(單位:字節)。sizeof(arr)與sizeof(arr[0])的大小都是四個字節或者八個字節。

所以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[])  //用數組接收實參,也可用指針接收實參,如void reverse(char* str) 
{
	char tmp = *str;
	int len = strlen(str);
	*str = *(str + len - 1);
	*(str + len - 1) = '\0';
	if (strlen(str + 1) >= 2)  //首尾交換后,剩下的元素構成的數組,長度要大于1,才逆序,只剩下一個元素,表明其是最中間的元素,放在原位就好。
	{
		reverse(str + 1);
	}
	*(str + len - 1) = tmp;
}
int main()
{
	char arr[101] = { 0 };
	scanf("%s", arr);
	reverse(arr);
	printf("%s\n", arr);
	return 0;
}

思路:假設一個數組有 n 個元素。

交換str[0]與 str[n-1],再逆序 str[1] 與 str[n-2]

交換 str[1] 與 str[n-2],再逆序 str[2] 與 str[n-3]。依次類推

&middot;&middot;&middot;&middot;&middot;&middot;

操作步驟:

  • 1.先將第一個字符,即 str[0] 位置上的字符放在一個臨時變量中。

  • 2.將最后一個元素交換到 str[0] 的位置去。

  • 3.將字符串中的&rsquo;\0&rsquo;放到arr[n-1] 的位置上去。

  • 4.此時從 str[1] 到 str[n-2] 的角度上看,是一個新的字符串,將 str[1] 與 str[n-2] 交換。

  • 5.將先前放在臨時變量中的第一個字符賦給 arr[n-1] 的位置上去。

注意:在第三步并沒有將放在臨時變量中的第一個字符直接往 str[n-1]上放,而是經過第四步,將str[1] 與 str[n-2] 交換后,才將之前未交換完的第一個字符放到 str[n-1] 上去。原因:如果直接將 str[0] 與 str[n-1] 上的元素通過一個臨時變量交換了。那么對于即將要交換的 str[1] 與 str[n-2] 來說,他們與&rsquo;\0&rsquo;之間隔了一個放在str[n-1]上的第一個字符,str[1] 與 str[n-2] 也就無法通過首尾字符直接交換的方式進行交換了 。

C語言指針怎么實現字符串逆序反轉

逆序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;
}

方法二比方法一傳的參數要多,直接將首尾字符通過第三個臨時變量進行交換就行。

“C語言指針怎么實現字符串逆序反轉”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西昌市| 外汇| 重庆市| 惠州市| 郑州市| 顺昌县| 福清市| 湟源县| 湘潭市| 平遥县| 石阡县| 盘山县| 小金县| 鲜城| 岱山县| 会同县| 巴林左旗| 公安县| 从江县| 汶川县| 杂多县| 岫岩| 容城县| 江山市| 聊城市| 北流市| 南部县| 荣昌县| 沐川县| 新兴县| 江阴市| 原平市| 汽车| 红原县| 平武县| 舒兰市| 乌拉特中旗| 阿瓦提县| 揭西县| 锡林郭勒盟| 体育|