溫馨提示×

溫馨提示×

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

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

字符串的一個小測試

發(fā)布時間:2020-05-20 17:57:52 來源:網(wǎng)絡 閱讀:304 作者:Sekai_Z 欄目:編程語言

    字符串即若干字符組成的序列,每個字符串都以‘\0’結(jié)尾,由于這個特點,每個字符串都有一個額外的字符開銷,所以要注意字符串越界的問題。

如:

char str[10];
strcpy(str,"0123456789");//越界

    同時,很多函數(shù)如strcpy、strlen、strcmp、strstr等字符串函數(shù)都是用了這個特點實現(xiàn)。

    為節(jié)省內(nèi)存,c和c++把常量字符串放到了靜態(tài)區(qū),當幾個指針賦值給相同的的字符串常量時,它們會指向相同的地址。但用常量初始化數(shù)組則不同

char a1[]="hello word";
char a2[]="hello word";//a1和a2地址不同

char *p1="hello word";
char *p2="hello word";//p1和p2地址相同,p1和p2均指向“hello word”這個空間

ps:常量具有只讀屬性

char a1[]="hello word";
a1[5]=',';//正確,可更改元素
char *p="hello word";
p[5]=',';//錯誤,*p指向一個常量,不可更改


練習:

    實現(xiàn)一個函數(shù),把字符串中每個空格替換成“%20”。

例:輸入“we are happy”

    輸出“we%20are%20happy”


實現(xiàn)方法2.0

    考慮從尾部一個一個向后移,先遍歷字符串,統(tǒng)計空格個數(shù),由于計算新字符串長度(每替換一個空格,長度+2),遇到空格就替換,時間復雜度O(n),利用數(shù)組下標即可以實現(xiàn)字符的移動

#include<iostream>
#include<assert.h>
#include<string.h>
using namespace std;

void ReplaceBlank(char *str)
{
	assert(str);//斷言str不為空
	
	int blank = 0;//空格數(shù)
	char *p = str;
	size_t length = strlen(str);

	while (*p != '\0')
	{
		if (*p == ' ')//遍歷查找空格個數(shù)
			blank++;
		p++;
	}
	size_t newlen = blank * 2 +length;//替換空格為%20的新長度
	
	while (newlen>length)
	{
		if (str[length] != ' ')
		{
			str[newlen] = str[length];
			newlen--;
			length--;
		}
		else
		{
			str[newlen--] = '0';
			str[newlen--] = '2';
			str[newlen--] = '%';//新長度減3
			length--;//原長度減一(空格)
		}
	}
}


實現(xiàn)方法2.1:

    上面使用數(shù)組實現(xiàn),同樣,指針也可以做到。用一個指針p1指向字符串末尾,另一個p2指向替換之后的字符串的末尾。向前移動指針p1,逐個移動到p2指向的空間,直到碰到空格,把p1向前移動一格,在p2前插入“%20”,當p1和p2指向同一位置,替換完畢

void ReplaceBlank(char str[])
{
	assert(str);

	size_t length = strlen(str);
	size_t blank = 0;//空格個數(shù)
	size_t i = 0;

	while (str[i] != '\0')
	{
		if (str[i] == ' ')
			blank++;
		i++;
	}

	if (blank == 0)
		return;

	size_t newlen = blank * 2 + length;
	char*p1 = str + length;
	char*p2 = str + newlen;
	
	while (p1!=p2)
	{
		if (*p1 != ' ')
		{
			*p2 = *p1;
			p1--;
			p2--;
		}
		else
		{
			p1--;
			*p2-- = '0';
			*p2-- = '2';
			*p2-- = '%';
		}
	}
}

測試方法

    1.空格分別在字符串中間和最后

    2.無空格

    3.空字符串

測試
void test()
{
	char str[20] = "we are happy";
	cout << str << endl;
	ReplaceBlank(str);
	cout << str << endl;
}
int main()
{
	test();
	getchar();
	return 0;
}


向AI問一下細節(jié)

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

AI