2

C(まだ学んでいる)を見てからしばらく経ち、K&Rの本に戻ったところです。

演習5-3(p107)に進んだところです。

第2章で示した関数strcatのポインターバージョンを記述します。strcat(s、t)は文字列tをsの末尾にコピーします。

私はこれを思いついた...

void strcat(char *s, char *t);

void strcat(char *s, char *t) {

    while (*s++ != '\0');
    s--;
    while (*t != '\0') {
        *s++ = *t++;
    }

    *--t = '\0';

}

int main() {
   char str[] = "Hey, hello";
   char str2[] = " are you?";

   strcat(str, str2);

   printf("%s\n", str);

   return 0;

}

うまくいくようです。

私が不思議に思っているのは、K&Rの本は、できるだけ少ない行で演習を書くことが多いということです-上記の独自のコードサンプルが提供されていれば、次のようなものが得られると思います...

void strcat(char *s, char *t) {

    while (*s++ != '\0');
    s--;
    while ((*s++ = *t++) != '\0');
    *--t = '\0';

}

私にとって、これは読みにくいです(この例はあまり良くないかもしれませんが、私はしばしば彼らのコードを見て、それが数行に分かれていれば、はるかによく理解できると思います)。この本で提供されている例は、ループの条件部分でこの種の割り当てを推奨しているようであり、実際には、行ごとに可能な限り多くのコードを詰め込んでいます。

たとえ読みやすさが損なわれたとしても、この本はできる限りできる限りのことをしようとしているのでしょうか。

これはただのCウェイですか?

4

3 に答える 3

13

K&Rは、本の中でイディオムの重要性を説明しています。はい、コードの簡潔さはCプログラマーによって評価されていますが、初心者を罰することは意図的に簡潔ではありません。Cを読み書きした後、パターンを認識し始めるので、他の誰かのコードでパターンを見ると、自分が何を見ているのかがわかります。

K&Rの例として与えられたものの反復を通過しますstrcpy()-彼らは簡潔さ対明快さの彼らの哲学を説明し、イディオムについて話します。

于 2010-10-16T10:45:31.200 に答える
5

未定義動作を呼び出しているため、プログラムが機能することを期待しないでください。

特定のサイズの2つのバッファーを定義します(長さstrは11バイト、長さstr2は10バイト)。次に、の間に、存在しないstrcatに書き込もうとします。str[11]この時点から、プログラムの実行については何の保証もありません。クラッシュしたり、期待どおりに動作したり、「42」と出力されてなぜだろうと思われる場合があります。

さらに、 Cの新しいバージョンではタイプがであるため、を変更*tしないでください。strcattconst char *

そして第3に、環境によっても提供される関数を再実装する場合は、別の名前を付けます。そうしないと、コンパイラが関数呼び出しと同等の組み込みコードに置き換える可能性があります。たとえば、GCCには、への__builtin_strlen呼び出しを置き換えることがあるstrlen

コードの修正バージョンは次のようになります。

#include <stdio.h>

/* renamed strcat to str_cat to avoid confusing the compiler */
void str_cat(char *s, const char *t) { /* added the const qualifier to t */

    while (*s++ != '\0');
    s--;
    while (*t != '\0') {
        *s++ = *t++;
    }
    /* removed the needless modification of *t */
    *s = '\0'; /* edit: added this line after the comment from Jonathan Leffler */
}

int main() {
   char str[80] = "Hey, hello"; /* note the large array size here */
   char str2[] = " are you?";

   str_cat(str, str2);
   printf("%s\n", str);

   return 0;

}
于 2010-10-16T11:05:57.827 に答える
0

他のより読みやすく、より効率的な例は、 Googleコード検索を使用して見つけることができます。

特にAndroidとBSDのソースコードを、の最新のC実装の良い例として見てくださいstrcat

代わりにstrcat、の実装を作成する必要がありstrlcat、そのソースの多くの例も見つけることができます。

于 2010-10-16T21:09:57.040 に答える