11

同様の問い合わせがたくさんありますが、私の場合、何が機能していないのかわかりません。

int mysize = 0;
mysize = sizeof(samplestring) / sizeof(*samplestring);
std::cout << mysize << '\n' << samplestring;

これは以下を出力します:

4

Press 'q' to quit.

どうしてそれは可能ですか?4は間違いなくこの文字列のサイズではありません。私は次のことを試しましたが、同じ結果になりました:

mysize = sizeof(samplestring) / sizeof(samplestring[0]);

編集:わかりました、これは宣言です:

char *samplestring = "Start."; 

私はC++を使用していますが、char*のみを受け入れる関数を使用する必要があります。コードの後半で、次のように新しい文字列をその変数に割り当てます。

samplestring = "Press 'r' for red text.";

はい、コンパイラは警告を表示しますが、上書きできない場合に別の文字列を使用するにはどうすればよいかわかりません...

4

6 に答える 6

15

4は文字列ではないため、は文字列のサイズではありsamplestringません。これはchar*、サイズが(プラットフォーム上で)4であり、1で割った値(のサイズchar)は、正しくは4です。

C ++では、std::stringlength()メソッドを使用します。

Cでは、strlenこれをパラメータとしてNULLで終了するcharポインタを使用します。

于 2012-09-10T14:40:32.540 に答える
5

まず、はとsizeof(samplestring[0])同じです。どちらも配列sizeof(*samplestring)の最初の要素のサイズを返します。また、が文字の配列であるsamplestringと仮定すると、は1と定義されます。samplestringsizeof(char)

samplestringがどのように宣言されているかを示していません。次のいずれかになります。

char const *samplestring = "Hello, World!";

また

char *samplestring = malloc( ... );

また

char samplestring[10];

最初の2つのケースでは、のタイプはsamplestringですchar *。したがって、をsizeof(samplestring)返しますsizeof(char *)。これは、プラットフォームでは4です。

3番目のケースでは、のタイプsamplestringは(10文字の配列)ですが、パラメーターとしてchar[10]aをとる関数を呼び出すと、char配列は、配列の最初の要素を指すポインターに減衰します。この場合、関数内で印刷しようとすると、ポインターのサイズが印刷されます。char *sizeof

元の配列のサイズを関数内から出力する場合は、関数パラメーターが元の配列タイプへのポインターである必要があります(タイプには元の配列のサイズが含まれます)。

#include <stdio.h>

void foo( char (*arr)[42] )
{
  printf( "%u", (unsigned)sizeof(*arr) );
}

int main()
{
  char arr[42];
  foo( &arr );

  return 0;
}  

出力:

42

これにより、関数に渡すことができる配列のサイズが修正され、多くの場合望ましくありません。他の唯一の解決策は、自分で配列を追跡することです(またはstrlen、NULLで終了する文字列がある場合は使用します)。

于 2012-09-10T14:49:34.853 に答える
4

文字列を定数にする方法は2つあり、テクニックは最初の方法でのみ機能します。1つ目は、コンパイル時にサイズを取得できる文字の配列を作成し、もう1つは、文字の配列へのポインターを作成します。

char samplestring[] = "hello";
char * samplestring = "hello";

2番目のケースのサイズを現在の方法で取得しようとすると、ポインターのサイズが得られます。32ビットビルドでは、ポインタのサイズは4文字です。つまり、ポインタは4文字と同じ量のメモリを使用します。

以下は、適切にnullで終了する文字列に対して常に正しい長さを示しますが、速度は遅くなります。

mysize = strlen(samplestring);
于 2012-09-10T14:43:43.617 に答える
1

配列ではなく、ポインタがあるように見えます。プログラムが必要とするときに配列がポインタに変換されるので、次のようになります。

size_t size(char * p) { // p is a pointer
    return sizeof(p) / sizeof(*p); // size of pointer
}

size_t size(char p[]) { // p is also a pointer        
    return sizeof(p) / sizeof(*p); // size of pointer
}

ただし、sizeof (char) == 1ここでは分割が冗長です。ポインタがより大きな型を指している場合は、予期しない結果が得られます。

C ++(明らかにCではない)では、テンプレートパラメーターとして配列のサイズを推測できます。

template <typename T, size_t N>
size_t size(T (&)[N]) {
    return N;  // size of array
}

std::vectorまたは、やなどのクラスを使用しstd::stringてサイズを追跡できます。

Cではstrlen、ゼロで終了する文字列の長さを見つけるために使用できますが、ほとんどの場合、配列サイズを自分で追跡する必要があります。

于 2012-09-10T14:48:47.427 に答える
0

あなたはchar上のポインタのサイズを尋ねています。つまり、32ビットシステムを使用していると思います。

C ++を使用している場合は、std :: string:を使用します。

std::string samplestring("Hello world");
std::cout << samplestring.size() << std::endl;
于 2012-09-10T14:41:12.917 に答える
0

要素のsizeofは、そのオブジェクトに割り当てられたメモリのサイズを返します。あなたの例では、文字列はおそらくどこかで宣言されています

samplestring[4]

この場合、メモリのサイズは4です。アプリケーションでおそらく必要な方法は次のとおりです。

strlen(samplestring);

nullで終了する文字列のサイズを返します(終了なし)

于 2012-09-10T14:42:37.900 に答える