2017-01-20 6 views
0

main関数で関数のサイズを使用すると正しく動作します。しかし、私は逆関数でそれを使用するときにのみ8を返します。なぜか、私は間違ってそれを使用しましたか?(これは、逆関数に渡された文字列を逆にする必要がある代入の始まりです。 string.hライブラリを使用することはできません。これを達成する別の方法があれば教えてください。sizeof関数を使用してサイズを取得し、配列をループし、一時変数を使用して逆向きにすることを計画していましたポインタとしてxを渡すとC sizeof((x))が機能しません

#include <stdio.h> 
char reverse(char *x); 
int main(int argc, char* argv[]) 
{ 
char word[] = "Apple pies"; 
printf("%s\n", word); 
reverse(word); 
printf("%s\n", word); 
printf("%s\n", reverse(word)); 
printf("%s\n", word); 
return 0; 
} 
char reverse(char *x) 
{ 
    char crud; 
    int lc =0; 
    size_t length = 0; 
    char *tmp = x; 
    while (*tmp++) 
    ++length; 
    while (length > lc) 
    { 
     crud = x[length]; 
     x[length] = x[lc]; 
     x[lc] =crud; 
     length--; 
     lc++; 

    } 
} 
+2

'reverse'では' x'は単なるポインタ(つまり 'char *')です。 'main'では、' x'は配列です( 'char [11]')。その 'sizeof'トリックは、ポインタではなく配列に対してのみ機能します。この長さをパラメータとして 'reverse'に渡す必要があります(または' strlen'を使います)。 – Cornstalks

+0

strlenはライブラリにあると仮定しますか?私は逆に渡された文字列を逆にする必要がありますが、(char * x)のパラメータを渡すだけで、string.hライブラリは使用できません。 – John

+1

この場合、独自のバージョンの 'strlen'を書く必要があります。それは簡単です。例えば'size_t length = 0; while(* x ++)++ length; ' – Cornstalks

答えて

1

reverseでは、xは単なるポインタです(つまり、char*)。しかし、mainでは、xは配列です(つまり、char[11])。そのsizeofトリックは、ポインタではなく配列に対してのみ機能します。長さをパラメータとしてreverseに渡す必要があります(またはstrlenを使用)。 This is covered in more detail in another question and its answers.

あなたの状況ではstrlenは禁止されています(パラメータで長さを渡すように)ので、strlenを手動で実装する必要があります。

size_t length_of_str(const char *x) { 
    size_t length = 0; 
    while (*x++) ++length; 
    return length; 
} 
+0

私のコードを更新しました。あなたは逆の機能に何が間違っているか知っていますか? – John

+1

@christian:現在の質問を変更するのではなく、新しい質問をする必要があります。細部を明確にするための編集は大丈夫ですが、これは元々の問題を根本的に変えるものです。私はあなたにヒントを与えます: 'x [length]'はあなたが思うものではありません(最初の反復で)。さらに助けが必要な場合は、新しい質問をすることをお勧めします。 – Cornstalks

+0

ありがとうございました! – John

1

main関数では、sizeof関数を呼び出すときに配列を渡しています。しかし、 'reverse'関数では、引数は文字ポインタです。ポインターにsizeofを呼び出すと、保証された結果はありません。 charポインタでsizeofと呼ぶと、4になることがよくあります。しかし、sizeofが常にその値を返すという保証はありません。ポインターにはsizeofを使用しないでください。

+0

配列がポインタとして関数に渡されるとき、 'sizeof'はポインタのサイズだけを計算します。一般に、バイナリデータを含む配列を操作する多くの関数も渡されるためには明示的な長さが必要です。 – rlee827

関連する問題