我正在尝试获取由 stdin 填充的数组的大小:
char *myArray;
cin >> myArray
cout << sizeof(myArray);
当我输入一个长度大于 4 的字符串时返回 4,例如“40905898”
我哪里错了?
sizeof
运算符静态评估您传递给它的东西的大小。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
这是因为您在指针上使用 sizeof(),在 32 位计算机上是 4 个字节:
printf("Pointer size: %d\n", sizeof(void*));
如果您的数组是以 null 结尾的字符串(最后一个元素是零字节或 '\0'),那么您可以使用
strlen(myArray)
获取元素的数量(减一)。例如:
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
或指向一个数组,没有好方法知道)。
此外,当您读取时,cin
您必须分配一些必须读取数据的空间,cin
不会为您分配空间。您可以在堆栈或堆上分配空间:
char stack_line[1024]; // This will overflow if more than 1024 chars are needed
char heap_line* = new char[1024]; // ditto
这里要注意的是,sizeof(stack_line) == 1024
虽然sizeof(heap_line) == 4
[在 32 位机器上]所以你在使用操作符时必须小心sizeof
。
在实践中,最好使用std::string
知道如何分配空间本身的 an。
好吧,如果你要使用 sizeof(myArray),你应该使用 sizeof(*myArray); 因为使用指针,没有星号是地址而不是值。像这样:
char *myArray;
cin >> *myArray;
cout << *myArray;