標準入力によって設定された配列のサイズを取得しようとしています:
char *myArray;
cin >> myArray
cout << sizeof(myArray);
これは、「40905898」など、長さが 4 より大きい文字列を入力すると 4 を返します。
どこが間違っているのですか?
sizeof
operator は、渡したもののサイズを静的に評価します。Achar*
は、マシンのアーキテクチャに応じて特定のサイズ (32 ビット システムでは 4 バイト、64 ビット マシンでは 8 バイト) を持つポインタです。あなたがやろうとしていることを達成するために、ソースファイルに追加するstring
ことで使用できるタイプを使用することをお勧めします。#include <string>
using namespace std;
string line;
cin >> line;
cout << line.length() << endl;
エラーが発生しにくく、使いやすいです。
ところで、あなたがやろうとしたことは本当に危険です。実際、 を使用するときはcin >> myArray
、まだ割り当てていないメモリが割り当てられているはずmyArray
です。これによりメモリが破損し、プログラムがクラッシュする可能性があり、バッファ オーバーラン攻撃を受ける可能性があります。
C++ の単純な配列には、そのサイズがわかりません。sizeof
配列が静的に割り当てられ、配列自体で使用している場合にのみ使用できますsizeof
。配列への別のポインターではありません。たとえば、これは期待どおりに機能しません。
int x[5];
int *a = &x[0];
// a[i] is now the same as x[i] but:
cout << sizeof(x) << endl; // prints 20, assuming int is 32 bits long
cout << sizeof(a) << endl; // prints 4, assuming a pointer is 32 bits long
要素数ではなく、配列の合計サイズが最初の行に出力されることに注意してください。sizeof(x)/sizeof(*x)
静的配列の要素数を調べるために使用できます。を使用して動的に割り当てられた配列では、これは不可能ですnew
。実際、C++ 配列は非常にエラーが発生しやすいため、それらを操作するときは細心の注意を払う必要があり、ほとんどの場合、代わりにvector
andを使用することをお勧めします。string
sizeof(pointer) は常に 4 を返します。 strlen() を使用します。
編集: IIRC、sizeof はコンパイル時に評価されます。内容ではなく、型のみが考慮されます。
これは、myArray が 4 バイトを占有するポインターであるためです。文字列の長さを取得したい場合は、strlen などを使用します。
ここには多くの問題があるようです:
myArray が初期化されていません - 入力はどこに保存されますか?
通常は次のように使用します: cin >> myArray; (シェブロンとセミコロンの方向に注意してください)
sizeof(myArray) は常に同じ値を返します (プラットフォームでは 4)
代わりにこのバージョンを試してください:
char* myArray= new char[50];
cin >> myArray;
cout << myArray;
cout << strlen(myArray);
独自の問題がないわけではありません(myArrayを削除する必要がありました)ので、ここで使用する回答を試してくださいstring myArray
これは、32 ビット コンピューターでは 4 バイトのポインターで sizeof() を使用しているためです。
printf("Pointer size: %d\n", sizeof(void*));
配列が null で終わる文字列 (最後の要素が 0 バイトまたは '\0') の場合、次を使用できます。
strlen(myArray)
要素の数 (マイナス 1) を取得します。例えば:
myArray = "Hello, world!";
printf("Number of characters: %d\n", strlen(myArray));
次のように、静的に割り当てられた配列を使用することもできます。
char array[128];
printf("sizeof(array) = %d\n", sizeof(array));
// prints 128
他の人が言ったように、myArray はポインターです。
しかし、なぜあなたは使わないのですstd::string
か?自分でバッファー割り当てを行う必要はありませんが、例では間違っています (ポインターmyArray
は何も指していません) 。
std::string myValue;
std::cin >> myValue;
std::cout << myValue.length();
必要に応じて、 を使用して文字列のポインター表現を取得できますstring::c_str()
。
他の人が言っsizeof
たように、渡されたオブジェクトのサイズを返しますが、ポインターの場合はポインターのサイズです。sizeof
ポインターをたどって、それが指しているオブジェクトのサイズを確認しませんchar
(それが1つまたは配列を指している可能性があることをどうやって知ることができますか?知る方法はありません)。
さらに、から読み取る場合cin
、データを読み取る必要があるスペースを割り当てる必要がありますが、cin
スペースは割り当てられません。スタックまたはヒープのいずれかにスペースを割り当てることができます。
char stack_line[1024]; // This will overflow if more than 1024 chars are needed
char heap_line* = new char[1024]; // ditto
ここで注意すべきことは、[32 ビット マシンで]sizeof(stack_line) == 1024
while演算子を使用するときは注意する必要があるということです。sizeof(heap_line) == 4
sizeof
実際にstd::string
は、スペース自体を割り当てる方法を知っている を使用することをお勧めします。
sizeof(myArray) を使用する場合は、sizeof(*myArray); を実行する必要があります。ポインターの場合、星は値ではなくアドレスであるためです。このような:
char *myArray;
cin >> *myArray;
cout << *myArray;