補足までに,char[] s
のどのタイミングで0
が出現するのかを書いておきます.ご存じでしたらすいません.
まず,
で与えられた文字列str[]
の末尾には必ずNull Character,すなわち空文字が入ります.エスケープシーケンスを使用して\0
と表される文字です.これは,ASCIIコード表を参照すると,整数の0
に割り当てられていることがわかります.
なので,配列str[]
の実態は
index |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
Symbol |
a |
b |
c |
d |
e |
f |
\0 |
DEC |
97 |
98 |
99 |
100 |
101 |
102 |
0 |
HEX |
61 |
62 |
63 |
64 |
65 |
66 |
0 |
のようにして格納されています.次のコードで確認できます.
#include <stdio.h>
int main(void){
char str[] = "abcdef";
for (int i = 0; i < 7; ++i) {
printf("%d: symbol: %c, dec: %d, hex: %x\n", i, str[i], str[i], str[i]);
}
return 0;
}
ここで,while内の条件式のところに偽値として0
が来たときループを終了,すなわちNull Characterの入っている文末が来たときに処理を終わることができるのです.文末までループしたいがためにこのような制御文になっています.したがって,冗長ではありますが
と書くことで「文末になるまで」という処理を明確に記述することも可能です.実際に,while(s[i])
にネストされている一番深いwhile文ではこの文になっていますね.謎に2パターンの記述をされていることがわかります.
また参照されている記事にケチつけておくと,in-placeでかつ数字を見つけるたびに文字を詰める実装をしたため計算量を文字列$S$のサイズ$|S|$を用いて表すと$O(|S|^2)$になってしまっていることを補足しておきます.もうちょっと改善したin-placeな実装やout-of-placeな実装もしくは他の配列に情報を持たせるアルゴリズムでは$O(|S|)$まで計算量を削減できます.