字符串即若干字符组成的序列,每个字符串都以‘\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<iostream>
#include<assert.h>
#include<string.h>
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;
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。