字符串的一个小测试-创新互联

   字符串即若干字符组成的序列,每个字符串都以‘\0’结尾,由于这个特点,每个字符串都有一个额外的字符开销,所以要注意字符串越界的问题。

创新互联建站专业为企业提供普宁网站建设、普宁做网站、普宁网站设计、普宁网站制作等企业网站建设、网页设计与制作、普宁企业网站模板建站服务,十载普宁做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

如:

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

   同时,很多函数如strcpy、strlen、strcmp、strstr等字符串函数都是用了这个特点实现。

   为节省内存,c和c++把常量字符串放到了静态区,当几个指针赋值给相同的的字符串常量时,它们会指向相同的地址。但用常量初始化数组则不同

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指向一个常量,不可更改

练习:

   实现一个函数,把字符串中每个空格替换成“%20”。

例:输入“we are happy”

   输出“we%20are%20happy”

实现方法2.0

   考虑从尾部一个一个向后移,先遍历字符串,统计空格个数,由于计算新字符串长度(每替换一个空格,长度+2),遇到空格就替换,时间复杂度O(n),利用数组下标即可以实现字符的移动

#include
#include
#include
using namespace std;

void ReplaceBlank(char *str)
{
	assert(str);//断言str不为空
	
	int blank = 0;//空格数
	char *p = str;
	size_t length = strlen(str);

	while (*p != '\0')
	{
		if (*p == ' ')//遍历查找空格个数
			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--;//原长度减一(空格)
		}
	}
}

实现方法2.1:

   上面使用数组实现,同样,指针也可以做到。用一个指针p1指向字符串末尾,另一个p2指向替换之后的字符串的末尾。向前移动指针p1,逐个移动到p2指向的空间,直到碰到空格,把p1向前移动一格,在p2前插入“%20”,当p1和p2指向同一位置,替换完毕

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

	size_t length = strlen(str);
	size_t blank = 0;//空格个数
	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;
}

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


名称栏目:字符串的一个小测试-创新互联
网址分享:http://ybzwz.com/article/dshgoj.html