-3

私のコードはコンパイルされますが、printf何も表示されませんか?

のフォーマッタ部分を取り出すと、printf問題なく動作します。

#include <stdio.h>

size_t MyStrlen(const char *s1)
{
    const char *s1Copy = s1;

    while (*s1)
    {
        *s1Copy++;
    }

    return s1Copy -s1;
}

int main(void) 
{
    const char str[] = "HELLO";

    printf("Length: %d \n", (unsigned int)MyStrlen(str));

    return 0;
}
4

2 に答える 2

9

*s1Copyループテストでは、インクリメントしていないNULLではなく非NULLをテストする*s1必要があります。現状では、*s1変更されることはないため、文字列引数の最後からすぐに歩いていることにs1Copy++なり、コードは正常に終了しません。

もちろん、空の文字列を渡さない限り、MyStrlenメソッド空の文字列に対して機能します。

while (*s1Copy)
    s1Copy++;
于 2012-07-24T03:34:37.540 に答える
5

これ:

printf("Length: %d \n", (unsigned int)MyStrlen(str));

大丈夫です。%dは引数を期待しますが、 と が両方の範囲内にある値に対して同じ表現を持つことが保証intされています。これ:intunsigned int

printf("Length: %u\n", (unsigned int)MyStrlen(str));

引数を%u期待するので、より良いです。unsigned int

の正しい形式size_tは次の"%zu"とおりです。

printf("Length: %zu\n", MyStrlen(str));

しかし、これは C99 の「新しい」機能であり、サポートしていない実装がまだいくつかある可能性があります。(特に、Microsoft は C99 のサポートに非常に時間がかかりました。) 移植性を最大限に高めるには (文字列の長さが 2 32 -1 バイト以下であると仮定します)、次のように使用できます。

printf("Length: %lu\n", (unsigned long)MyStrlen(str));

これはあなたが尋ねた質問に答えますprintf; pb2q は、あなたが見ている問題の実際の原因を適切に診断しました (そして、私を打ちのめしました!)。

于 2012-07-24T03:48:28.663 に答える