文字列の小さなテスト
文字列はいくつかの文字からなるシーケンスで、各文字列は「0」で終わります.この特徴により、各文字列には追加の文字オーバーヘッドがあるので、文字列の境界を越える問題に注意してください.
次のようになります.
同時に、strcpy、strlen、strcmp、strstrstrなどの文字列関数の多くはこの特徴で実現されている.
メモリを節約するために、cとc++は定数文字列を静的領域に配置し、いくつかのポインタが同じ文字列定数に割り当てられると、同じアドレスを指します.定数で配列を初期化すると違います
ps:定数に読み取り専用属性がある
練習:
文字列の各スペースを「%20」に置き換える関数を実装します.
例:「we are happy」と入力
出力「we%20 are%20 happy」
実装方法2.0
末尾から1つずつ後ろに移動することを考慮して、先に文字列を遍歴して、スペースの個数を統計して、新しい文字列の長さ(1つのスペースを置換するごとに、長さ+2)を計算するため、スペースに出会って置換して、時間の複雑度O(n)、配列の下のスケールを利用して文字の移動を実現することができます
実装方法2.1:
上は配列を用いて実現され,同様にポインタも可能である.1つのポインタp 1で文字列の末尾を指し、もう1つのp 2は置換後の文字列の末尾を指す.ポインタp 1を前方に移動し、p 2が指す空間に1つずつ移動し、スペースにぶつかるまでp 1を前方に移動し、p 2の前に「%20」を挿入し、p 1とp 2が同じ位置を指すと置換が完了する
テストメソッド
1.スペースは文字列の中央と最後に表示されます.
2.スペースなし
3.空の文字列
次のようになります.
char str[10];
strcpy(str,"0123456789");//
同時に、strcpy、strlen、strcmp、strstrstrなどの文字列関数の多くはこの特徴で実現されている.
メモリを節約するために、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%20 are%20 happy」
実装方法2.0
末尾から1つずつ後ろに移動することを考慮して、先に文字列を遍歴して、スペースの個数を統計して、新しい文字列の長さ(1つのスペースを置換するごとに、長さ+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:
上は配列を用いて実現され,同様にポインタも可能である.1つのポインタp 1で文字列の末尾を指し、もう1つのp 2は置換後の文字列の末尾を指す.ポインタp 1を前方に移動し、p 2が指す空間に1つずつ移動し、スペースにぶつかるまでp 1を前方に移動し、p 2の前に「%20」を挿入し、p 1とp 2が同じ位置を指すと置換が完了する
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;
}