1

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;
}
4

5 に答える 5

4

一致するポインタを確認しますか?

于 2010-10-16T11:40:12.207 に答える
2

現在の文字のアドレスを元の文字列ポインタと比較する それらが一致する場合、現在の文字が最初の文字であり、したがって文字列の先頭である必要があります。

于 2010-10-16T11:40:03.153 に答える
2

標準 C 関数を使用できますか? その場合、 strlen() を使用して各文字列の長さを取得できます。

例えば、

int lenS = strlen(s);
int lenT = strlen(t);

for (int i = 0; i < lenT; ++i) {
  if (s[lenS - i] != t[lenT - i])
    return 0;
}

return 1;
于 2010-10-16T11:46:27.570 に答える
1

C 文字列の先頭には、文字列の開始位置を識別する標識はありません。ポインターのコピーを作成するなど、文字列の先頭への参照を保持する必要がありますstr1

また、この演習では、逆方向のスキャンを行う必要はありません。フォワード スキャンを使用してそれを行うことができstr2ますstr1

于 2010-10-16T11:46:23.333 に答える
1

文字列関数の使用が許可されている場合:

int strend(char *s, char *t)
{
    char *st = s + strlen(s) - strlen(t);
    if (st < s) return 0;
    if (!strcmp(st,t)) return 1;
    return 0;
}

tiaによるさらに良い(コメント):

int strend(char *s, char *t)
{
    char *st = s + strlen(s) - strlen(t);
    if (st >= s) return !(strcmp(st,t)); else return 0

}

于 2010-10-16T11:57:51.023 に答える