0
#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を返すのですか?

4

4 に答える 4

14

Cにはデータ型はありませんstring。これはC++ですか?それともstringtypedefですか?

stringのtypedefであると仮定すると、char *おそらく必要なのはstrlen、ではなくsizeofです。取得している8sizeofは、実際には(文字列の最初の文字への)ポインターのサイズです。

于 2011-02-09T03:57:10.173 に答える
6

それはそれをポインタとして扱っています、ポインタのサイズは明らかにあなたのマシン上で8バイト=64ビットです

于 2011-02-09T03:57:16.883 に答える
4

「これについては心配しないでください->私が書いたlib」と言いますが、これは文字列を定義する重要な情報です。おそらく文字列はchar*であり、マシン上のサイズは8です。したがって、given [i]は文字列であるため、sizeof(given [i])は8です。おそらく、sizeofではなくstrlenが必要です。

于 2011-02-09T03:58:07.770 に答える
3

これは、文字の配列自体と、その配列が始まる場所へのポインタとの間でよくある間違いです。

たとえば、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

これで問題が解決することを願っています。

于 2016-01-13T17:59:29.373 に答える