2011-02-09 3 views
-1
#include "usefunc.h" //don't worry about this -> lib I wrote 
int main() 
{ 
    int i; 
    string given[4000], longest = "a"; //declared new typdef. equivalent to 2D char array 
    given[0] = "a"; 
    printf("Please enter words separated by RETs...\n"); 
    for (i = 1; i < 4000 && !StringEqual(given[i-1], "end"); i++) 
    { 
     given[i] = GetLine(); 
     /* 
     if (sizeof(given[i]) > sizeof(longest)) 
    { 
     longest = given[i]; 
    } 
     */ 
     printf("%lu\n", sizeof(given[i])); //this ALWAYS RETURNS EIGHT!!! 
    } 
    printf("%s", longest); 
} 

なぜ、常に8を返しますか?C - > sizeof stringは常に8です。

+0

'string'が' char * 'のtypedefの場合は? – KitsuneYMG

+0

typedef、すみません。 C – tekknolagi

+0

'string'とは何ですか? – Peyman

答えて

12

Cにはstringデータ型がありません。これはC++ですか?またははtypedefですか?

stringchar *のtypedefであると仮定すると、strlenではなく、sizeofとなります。 sizeofで取得している8は、実際には文字列の最初の文字までのポインタのサイズです。

+0

これは、互換性のないポインタ型を示しています:( – tekknolagi

+0

'string'を定義する方法は、' char * 'ではないので参照する必要があります。 – Kevin

+0

@tekknolagi:なぜ定義をポストしないのですか?その型付きのですか? –

5

それはポインタとして扱いされ、ポインタのsizeofは明らかであるあなたが、「このことを心配しないでください - > libに私が書いた」と言うあなたのマシン

+0

ありがとうございます - > strlen()は互換性のないポインタ型を言っているので、動作しません – tekknolagi

4

上= 64ビットの8バイトが、これは重要な部分ですがそれは文字列を定義するので、情報の。おそらくstringはchar *であり、マシン上のサイズは8です。したがって、与えられた[i]が文字列であるため、sizeof(given [i])は8です。おそらくあなたはsizeofではなくstrlenを望むでしょう。

+0

strlenについての他のコメントを参照してください – tekknolagi

+1

@tekknolagi文字列がどのように定義されているかを正確に確認する。 –

1

これは、文字配列自体とその配列の開始位置へのポインタの間でよくある間違いです。例えば

リテラルCスタイルの文字列:

char hello[14] = "Hello, World!"; 

は14バイト(メッセージ13、およびヌル終端文字の1)です。 sizeof()を使用して、生のCスタイルの文字列のサイズを調べることができます。我々はその文字列へのポインタ作成する場合

しかし、:

char* strptr = hello; 

をそしてそれはsizeof()とサイズだ見つけようと、それだけでいつもお使いのシステム上のデータポインタのサイズを返します。

つまり、文字列ライブラリから文字列のサイズを取得しようとすると、実際にはその文字列の先頭にポインタのサイズしか取得できません。あなたが使用する必要があることは、文字の文字列のサイズを返しますstrlen()機能、次のとおりです。

sizeof(strptr); //usually 4 or 8 bytes 
strlen(strptr); //going to be 14 bytes 

が、これは物事をクリア願っています!

関連する問題