我正在尝试获取由stdin填充的数组的大小:
char *myArray;
cin >> myArray
cout << sizeof(myArray);
当我输入长度大于4的字符串时返回4,例如“40905898”
我哪里错了?
答案 0 :(得分:11)
sizeof
运算符静态计算您传递给它的事物的大小。 char*
是一个指针,取决于机器架构具有特定大小(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
和string
。
答案 1 :(得分:2)
sizeof(指针)将始终返回4.您想使用strlen()。
编辑:IIRC,sizeof在编译时进行评估,它只关心类型而不是内容。
答案 2 :(得分:1)
这是因为myArray是一个占用4个字节的指针。如果你想获得字符串的长度,可以使用strlen或类似的东西。
答案 3 :(得分:0)
你似乎有很多问题:
myArray未初始化 - 输入将在何处生效?
您通常使用:cin&gt;&gt; myArray的; (注意人字形和分号的方向)
sizeof(myArray)将始终返回相同的值(平台上为4)
请尝试使用此版本:
char* myArray= new char[50];
cin >> myArray;
cout << myArray;
cout << strlen(myArray);
它不是没有自己的问题(我应该删除myArray),所以你应该尝试使用string myArray
答案 4 :(得分:0)
这是因为你在指针上使用sizeof(),这是32位计算机上的4个字节:
printf("Pointer size: %d\n", sizeof(void*));
如果您的数组是以空字符结尾的字符串(最后一个元素是零字节或'\ 0'),那么您可以使用
strlen(myArray)
获取元素数量(减1)。 E.g:
myArray = "Hello, world!";
printf("Number of characters: %d\n", strlen(myArray));
您还可以使用静态分配的数组,如下所示:
char array[128];
printf("sizeof(array) = %d\n", sizeof(array));
// prints 128
答案 5 :(得分:0)
正如其他人所说,myArray是一个指针。
但为什么不使用std::string
?您不需要自己进行缓冲区分配,这在您的示例中是错误的(指针myArray
指向任何内容)
std::string myValue;
std::cin >> myValue;
std::cout << myValue.length();
如果需要,您可以使用string::c_str()
来获取字符串的指针表示。
答案 6 :(得分:0)
正如其他人所说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
运算符时必须小心。< / p>
在实践中,最好使用知道如何分配空间的std::string
。
答案 7 :(得分:0)
如果 要使用sizeof(myArray),那么你应该完成sizeof(* myArray);因为有了指针,没有星是地址而不是价值。 像这样:
char *myArray;
cin >> *myArray;
cout << *myArray;