2
bool repeat_char(char *s, int n);
//R: s is a C-string of at least n non-NUL characters and n > 0
//E: returns true if the first n characters are fully repeated throughout the string s, false
//   otherwise.

ポインターによるトラバーサルを使用してこの関数を実装するのに問題があります。s から最初の n 文字を抽出し、それを s との比較に使用できると考えていましたが、どうすればそれができるかわかりません。s を一度に 1 文字ずつトラバースしている場合、s の最初の n 文字など、テキストのブロックと一致することを確認するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

1

実際には、一度に1つずつしか文字を比較できないため、とから始めてss+n文字を比較します。それらが一致する場合は、の文字​​をと比較しs+1ますs+n+1。それらが一致する場合は、に移動しs+2、以下同様にに移動しnます。その時点まで一致する場合は、文字列の最後に到達するまで、s + n * 2、次にs + n*3などから繰り返します。

不一致を見つけた場合、またはサブ文字列の最後の文字と一致する以外の場所で文字列の最後に到達した場合は、falseを返します。それ以外の場合は、trueを返します。

于 2012-10-24T04:14:51.743 に答える
0

別の方法 (ポインターによるトラバーサルではない):

bool repeatOfFirstChars(int n, const char *s)
{
  len = strlen(s);

  if (len % n != 0) return false;

  for (int step = 1; step < len / n; step++) {
    if (0 != strncmp(s, s+n*step, n)) return false;
  }

  return true;
}
于 2012-10-24T14:35:46.710 に答える