2
size_t stringlength(const char *s)

この関数を使用して、文字列の長さをどのように見つけることができますか? を使用する strlen()のではなく、作成するのです。どんな助けでも大歓迎です。

4

4 に答える 4

10

カウントを維持しながら、文字列を循環/反復します。を押す\0と、文字列の最後に到達します。

関連する基本的な概念は、ループ、条件 (文字列の終わりをテストするため)、カウンターの維持、文字シーケンス内の要素へのアクセスです。

:もっと慣用的/賢い解決策があります。ただし、OP は C とプログラミングにとって明らかに新しいものです (攻撃を意図したものではありません。私たちはすべて初心者として始めました)。そのため、解決策の 1 つが行ったようにポインター演算を適用したり、過度に簡潔/コンパクトな解決策を記述したりすることは、OP のニーズについてではなく、それ以上のことです投稿者のプログラミング スキルのデモンストレーション :) わかりやすい解決策を意図的に提案したことで、少なくとも 1 つの反対票を獲得しました (そうです、これは私が提供したことのない「架空のコード」に対するものです。私はそうしたくありませんでした)。コードソリューションを提供する準備ができていますが、OPにいくつかのガイダンスでそれを理解させてください).

要点:回答は常に質問者のレベルに合わせるべきだと思います。

于 2012-07-09T13:16:39.260 に答える
2
size_t stringlength(const char *s) {
   size_t count = 0;
   while (*(s++) != '\0') count++;
   return count;
}

紛らわしい部分は式*(s++)である可能性があります。ここでは、++演算子を使用してポインタをバッファ内の次の文字を指すように移動し、逆参照演算子を使用*してポインタ位置のコンテンツを取得しています。別のより読みやすいアプローチは次のとおりです。

size_t stringlength(const char *s) {
   size_t count = 0;
   while (s[count] != '\0') count++;
   return count;
}

別の 2 つの参照バージョン (ただし読みにくい) は次のとおりです。

size_t stringlength(const char *s) {
   size_t count = 0;
   while (*s++) count++;
   return count;
}


size_t stringlength(const char *s) {
   const char* c = s;
   for (; *c; c++);
   return c - s;
}

ここに記載されているコードは、上記の回答で説明されているアルゴリズムを実装する方法のアイデアを提供するための参照にすぎませんが、同じ要件を実行するより効率的な方法があります (たとえば、一度に 4 バイトをチェックするglibc の実装を確認してください) )

于 2012-07-09T13:20:02.593 に答える
-1

s が null 以外のポインターであると仮定すると、次の関数は s を先頭から終端のゼロが見つかるまでトラバースします。渡された文字ごとにs++;count がインクリメントされますcount++;

size_t stringlength(const char *s) {
   size_t count = 0;
   while (*s) {
     s++;
    count++;
   }
   return count;
}
于 2012-07-09T13:28:00.450 に答える