2012-06-17 6 views
5

/というC文字列の出現回数をどのように数えることができますか?C文字列内の文字 '/'の出現回数をどのように数えることができますか?

私はこれを行うことができます:

int countSlash(char str[]) 
{ 
    int count = 0, k = 0; 
    while (str[k] != '\0') 
    { 
      if (str[k] == '/') 
       count++; 
      k++; 
    } 
    return count; 
} 

をしかし、これはエレガントな方法ではありません。どのようにそれを改善するための任意の提案?私は簡潔のために簡潔を推奨するものではないことを追加する必要があります、と私はいつも明確な表現を選ぶだろう、他のすべてのものが等しい

ptr = str; 

while ((ptr = strchr(ptr '/')) != NULL) 
    count++, ptr++; 

+3

あなたのものは十分に上品です。 –

+1

主な批判は、(a)それが渡される文字列を変更しないことを約束する 'int countChar(char const * str、char c)'と比較して、 (b)は、アスタリスク、ブランクなどをカウントするために使用することができ、本質的に効率の低下はありません。単純な関数 'int countSlash(char const * str){return countChar(str、 '/');}を書くことができます。 } 'もしあなたが実際にあまり一般的でないインターフェースを望むならば。インライン展開などが有効になっていると、コンパイラが最適化することができます。 –

+0

優雅さは、いろいろな形である可能性があります。それは最短か、最も読みやすいか、または最も簡単に理解されるかもしれません。また、最も読みやすいものは、他の人にはほとんど読めないものになる可能性があります。したがって、「エレガンス」は主観的な考えです。たぶんスピードの点で最も効率的な方法を求めてください。 – ChinoCarloSedilla

答えて

5

strchrは小さなループになるだろう。私はstrchrループを見つけました。エレガントですが、問題の元の実装は明確であり、関数内に存在するので、ユニットテストに合格していれば、他のものよりも好きではありません。

+1

真実ですが、21世紀にそのようなコードを書かなければならない理由はありません! –

+1

@OliCharlesworth HAおそらくそうです。私は標準Cでこのような1-linerに問題はありませんが、このようなループは自分のコードで終わることはよくありません。 – pb2q

+3

21st Century C Coderはどのように@OliCharlesworthというコードを書いていますか?私はまだ働いている20世紀のCコーダーです。 pb2qが書いたものは、 'countSlash()'関数の本体として私にはよく見えます。 –

2

あなたは十分です。たぶん、これはいくつかにきれいになります。

int countSlash(char * str) 
{ 
    int count = 0; 
    for (; *str != 0; ++str) 
    { 
     if (*str == '/') 
      count++; 
    } 
    return count; 
} 
0

は、これも動作します:

int count=0; 
char *s=str; 
while (*s) count += (*s++ == '/'); 
+3

なぜスペースはありませんか?なぜキャスト?なぜ単に 'n + =(* s ++ == '/');'? –

+0

@JonathanLeffler:そうですね、それは目の上で楽になります;) - キャスト:str []は配列で文字列ではないので、これはC – slashmais

+1

です@slashmais、私は明示的キャストは完全に冗長です。私はC言語で実際のコーディングを行って以来長い間経っていますが、思い出したように、配列を参照する変数を渡すと、自動的に配列の最初の要素へのポインタに降格します。したがって、 'char str []'と 'char * str'は、すべての目的と目的のために完全に交換可能でなければなりません。 –

2

ジェネリックインターフェイス、明白なアプローチ、適切なタイプと、純粋慣用表現:

size_t str_count_char(const char *s, int c) 
{ 
    size_t count = 0; 

    while (s && *s) 
     if (*s++ == c) 
      ++count; 

    return count; 
} 

オリCharlesworthをおそらく同じ行の課題と条件文について懸念が出ますが、かなり隠されていると思います.-)

+0

+1のアイデアは大好きです – ron

+0

私は間違っているかもしれませんが、単純に 'while(* s)'に単純化することができます。実行の開始時に 's'が' NULL'ポインタでないことを確認する必要があるだけです。 –

+0

@GregE:そうです、ここでは一度は「NULL」が必要です。私はしっかりとコンパイラは私より賢いと信じて、私はこれを最適化するためにコンパイラに依存しています。この関数のどこにでも 's'を変更していないので、簡単なはずです。 – Philip