关于字符串的知识:
运行以下代码,查看结果:
void test() {
char str1[] = "helloworld";
char str2[] = "helloworld";
char* str3 = "helloworld";
char*str4 = "helloworld";
if (str1 == str2) { cout << true << endl; }
if (str1 != str2) { cout << false << endl; }
if (str3 == str4) { cout << true << endl; }
if (str3 != str4) { cout << false << endl; }
}
int main()
{
test();
return 0;
}
结果是0和1。
因为str1和str2是字符串,系统会为它们各自分配长度为12的空间,然后将"helloworld"字符串分别复制到两个空间里面去,str1和str2是两个初始地址不同的数组,因此比较结果是不同的。
str3和str4是两个指针,系统没有必要为他们分配空间存储内容。str3和str4都指向"helloworld"字符串的的首地址。由于它们指向的是同一个地址,因此比较结果是相同的。
既然==比较的是地址,那么如何进行两个字符串之间的比较呢?可以用strcmp(const char* str1,const char* str2)函数进行比较,也可以自定义函数逐个字符进行比较。
题目:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解题思路:
1.重新设置一个空的字符串,在将原字符串复制到新字符串中的同时,将“%20”顺便插入新的字符串。
2.通过移动的方式,在原字符串上进行更改。为了减少移动次数,将从后向前进行移动。
遍历字符串,计算字符串的长度(不包括'\0'),同时计算更改后字符串的长度
设置两个指针p和q,分别指向更改前字符串的末尾和更改后字符串的末尾,移动包括'\0'。
当p!=q时,进行如下操作:
如果此时*p不为空格,将*p复制给*q;
如果此时*p为空格,以q为起始位置,依次插入'0','2','%'。
注意p与q的下标。
代码如下:
void replaceSpace(char *str,int length) {
int i = 0;
int num_space = 0;
int orginal_length = 0;
//先统计空格的数量
while (*(str+i)!='\0') {
++orginal_length;
if (*(str+i)==' ') { ++num_space; }
i++;
}
//根据空格的数量计算出目标字符串的长度
char* p =str+ orginal_length;
int new_length = orginal_length + 2 * num_space;
char* q =str+ new_length;
if (new_length +1 > length) { return; }
while (p!=q) {
while(*p!=' '){
*q--=*p--;
}
if(*p==' '){
*q--='0';
*q--='2';
*q--='%';
}
p--;
}
}