誰かにはわかるポインタ入門編
// '\' エスケープ #include <stdio.h> int main() { char str[256] = "ab\\c"; char* cp; char str2[256]; int i=0; for (cp=str; *cp != '\0'; cp++) { //printf("%c\n", *cp); if (*cp == '\\') { str2[i] = *cp; i++; str2[i] = '\\'; } else{ str2[i] = *cp; } i++; } str2[i] = '\0'; printf("str =%s\n", str); printf("str2=%s\n", str2); return 0; } -- run str =ab\c str2=ab\\c
文字列中の'\'をエスケープする例。
for (cp=str; *cp != '\0'; cp++) {
の部分がポインタを知らない人は謎に思えるかもしれない。
自分もC言語はもうあまり触ることがないので解説を入れておく。
まず、for文は for(初期値;繰り返し条件;カウンタ) で構成されており、
初期値の cp=str はポインタ変数cpに配列strのアドレスを代入する、と読み替えることができる。
配列は連続したアドレスに格納されているので一回目のループ時は
*cp(ポインタを参照)に 'a'が代入される。二回目のループ字は
'b'、三回目は'c'、四回目は '\0' 文字列の最後を示すヌル文字である。
また説明するまでもないが cp++はアドレスを一つ進めるになる。
次は条件式だが
if (*cp == '\\') {
ポインタの参照値が '\' なら str2[i] = *cp; その文字をコピーして
str2の次の配列番号に '\' を追加で入れるというだけだ。
もちろんこうしていくとstrが'\0'の時はfor文を抜けてしまうので
最後に '\0' を入れて文字列を確定している。
・・なんか適当になったがわかるのでよしとする。
#include <stdio.h> int main() { char str[256] = "ab\\c"; char* cp; char str2[256]; int i=0; for (cp=str; *cp != '\0'; cp++) { if (*cp == '\\') str2[i++] = '\\'; str2[i++] = *cp; } str2[i] = '\0'; printf("str =%s\n", str); printf("str2=%s\n", str2); return 0; }
ちょっと短くしてみた。どうせ'\'の時はコピーしてるので一行にまとめてstr2[i++] = *cp;。
あとi++だろうか。i++と++iの違いを知っていれば分かるが
str2[i++] はstr2[0]を左辺値としたあと、iをひとつインクリメントするという意味だ。
以上、誰かにはわかるポインタ入門編でした