K&R演習 5-4 (p107) を行っています。
関数 strend(s,t) を記述します。これは、文字列 t が文字列 s の末尾にある場合は 1 を返し、それ以外の場合は 0 を返します。
これを行うための最良の方法は...
- 両方のポインタを最後までインクリメントする
- 各文字が一致する間、両方の文字列を逆方向にカウントします
- 2 番目の文字列の先頭まで数え終わったら 1 を返す
だからここに私が持っているものがあります...
int strend(const char *str1, const char *str2) {
int i = 0;
while (*str1++ != '\0');
while (*str2++ != '\0') {
i++;
}
i++;
while (*str2-- == *str1-- && i > 0) {
i--;
}
return (i == 0);
}
ご覧のとおり、カウンターを使用して、2 番目の文字列の先頭にいつ到達したかを示しました。
\0
文字列の先頭にいつ到達したかを知るためにカウンターなしで使用できる他のループはありますか (文字列の末尾を探すのと同様です)。
ありがとう。
アップデート
ポインターを使用することを考えていませんでした - 私はまだ学んでいて、いくつかのことを忘れています!
私はこれを思いつきました...
int strend(const char *str1, const char *str2) {
char *start = str2;
while (*str1++ != '\0');
while (*str2++ != '\0');
while (*str2-- == *str1--) {
if (str2 == start) {
return 1;
}
}
return 0;
}