長さが 1 ずれるだけでなく、0 を返したいところに空の文字列を引数として指定すると、アクセス違反になる可能性があります (ただし、ほとんどの場合はゼロなのでそうはなりません)。バイトは初期化されていないメモリでは非常に一般的です)、または乱数 (基本的に、c-string の空の文字列定数の 1 バイト後ろに格納されているゼロ以外のバイト数を返します。
行の最初のものとして評価されるプレフィックスインクリメンタル演算子を使用しているため、長さは 1 ずれています。
while(*(++s)!='\0')
具体的には、そこで何をしているのかを長い目で見ると、次のようになります。
char *s = "this";
int i = 0;
while (1) {
s = s + 1;
if (*s == '\0') break;
i++;
}
printf("%d", i);
...
問題が見えますか? ++s
最初にポインタをインクリメントします。したがって、文字列の最初の文字をスキップします。
とにかく、おそらくあなたが望むのは次のようなものです:
int len(const char *s) {
int clen = 0;
while (*s++ != '\0') clen++;
return clen;
}
もちろん、標準 C ライブラリを持っstrlen()
ているのに、なぜ車輪を再発明するのかと尋ねる人もいるかもしれません。strnlen()
もしかして、ただの練習?