2

そこで、write()システムコール(printfやその他のオプションは使用できません)を使用して文字列をコンソールに出力する関数を作成しようとしています。しかし、私は障害にぶつかりました。

これが私の関数です:

static void doPrint (const char *s)
{
    write (STDOUT_FILENO, s, sizeof(s));
}

これはによって呼び出されています:

doPrint( "Hello World!\ n");

ただし、印刷されるだけです。

こんにちはウォ

私は何が間違っているのですか?

注:stdlibおよびstdioへのアクセスは制限されています

ありがとう

4

6 に答える 6

4

このコンテキストでsizeofは、必要なことは実行されません。文字列のサイズではなく、ポインタのサイズが生成されます。strlen代わりに使用してください。

ただし、stdlibへのアクセスは制限されています

whileあなたはとカウンターを使ってあなた自身を転がすことができます。未テスト:

size_t my_strlen(const char *s)
{
    size_t len = 0;
    while (*s++)
        len++;

    return len;
}

または少し効率的なバージョン:

size_t my_strlen(const char* s)
{
   const char *end = s;
   while (*end++) {};
   return end-s-1;
}

上記は、ポインターが文字列の最後の位置に進められ、サイズが最後のポインターの位置と最初のポインターの位置の差から1を引いたものであるため、機能します。もちろん、ヌル終了文字を処理します。

于 2013-02-13T21:28:39.017 に答える
0

問題はあなたsizeofです。サイズを明示的に渡すか、を使用する必要がありますstrlen。ポインタのサイズを取っています。strlenただし、nullで終了する文字列でのみ機能します。

于 2013-02-13T21:28:39.470 に答える
0

問題はsizeof、ポインター変数がポインター変数の長さであるということです。strlen(s)ポインタに何文字あるかを調べたいと思います。

于 2013-02-13T21:28:42.460 に答える
0

あなたはしたくないsizeof(s)。印刷する文字数は文字列の長さであり、文字列の最初の文字へのポインタのサイズではありません。

于 2013-02-13T21:28:49.890 に答える
0

sはポインタであり、配列ではないため、最初のsizeof(char *)バイトのみを出力します(この場合、たまたま8バイトです。おそらく64ビットシステムを使用しています)。

次を使用して文字列の長さを見つける必要がありますstrlen()

write (STDOUT_FILENO, s, strlen(s));

このドキュメントも読む必要があります。

于 2013-02-13T21:29:06.257 に答える
0

write (STDOUT_FILENO, s, strlen(s));文字列がnullで終了していると仮定します。

于 2013-02-13T21:29:13.427 に答える