带有stdin的C ++ char数组

时间:2008-12-18 12:37:24

标签: c++ arrays string pointers sizeof

我正在尝试获取由stdin填充的数组的大小:

char *myArray;
cin >> myArray
cout << sizeof(myArray);

当我输入长度大于4的字符串时返回4,例如“40905898”

我哪里错了?

8 个答案:

答案 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 ++数组非常容易出错,在使用它们时应格外小心,在大多数情况下最好使用vectorstring

答案 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) == 1024sizeof(heap_line) == 4 [在32位机器上] 所以在使用sizeof运算符时必须小心。< / p>

在实践中,最好使用知道如何分配空间的std::string

答案 7 :(得分:0)

如果 要使用sizeof(myArray),那么你应该完成sizeof(* myArray);因为有了指针,没有星是地址而不是价值。 像这样:

char *myArray;
cin >> *myArray;
cout << *myArray;