如何获取数组中已用空间的大小? (不是sizeof); C ++

时间:2010-02-10 00:11:09

标签: c++

#include<iostream>
using namespace std;

int main()
{
    char arr[200];
    while(1) {
        cin >> arr;
        int i = sizeof(arr);
        cout << "The arr input is "<< arr 
             << " and the size of the array is "<< i << endl;
    }
    return 0;
}

输入34, 此代码输出:arr输入为34,数组大小为200


虽然我希望它获得数组的已用空间的大小。所以对于最后一个输入我希望它输出:arr输入是34,数组的大小是2


有人可以告诉我怎么做?

6 个答案:

答案 0 :(得分:4)

也许你想要strlen(arr)。它必须以null结尾,否则cout << arr将无效。

您需要#include <cstring>

答案 1 :(得分:1)

在一般情况下,没有自动的方法可以做你想要的事情 - 你需要以某种方式跟踪你自己的计数器,或者通过为数组播种'无效'值(你定义的)和搜索找到已使用元素的结尾(这就是C风格字符串中的'\ 0'终止符)。

在您发布的示例代码中,数组应该接收一个空终止的C风格字符串,您可以使用该知识来计算有效元素的数量。

如果您正在使用C ++或其他具有更高级数据结构的库,您可以使用一种能够跟踪此类事物的库(例如std::vector<>)。

答案 2 :(得分:0)

  

数组的已用空间大小

没有这样的事情。如果你有一个200个字符的数组,那么你有200个字符。数组没有“已使用”和“未使用”空间的概念。它只适用于C字符串,因为它们以0字符终止。但话说回来,数组本身无法知道它是否持有C字符串。

答案 3 :(得分:0)

以较少参与的方式,你可以只计算每个字符,直到你只用一个while循环击中一个null。它将完成strlen()所做的完全相同的事情。另外,在实践中,你应该用cin进行类型检查,但我认为这只是一个测试。

#include <iostream>
using namespace std;

int main()
{
    char arr[200];
    int i;
    while(1) {
        cin >> arr;
        i=0;
        while (arr[i] != '\0' && i<sizeof(arr))
            i++;
        cout << "The arr input is "<< arr
             << " and the size of the array is "<< i << endl;
    }
    return 0;
}

答案 4 :(得分:0)

为了完整起见,这是一个更像C ++的解决方案,它使用std::string而不是原始的char数组。

#include <iostream>
#include <string>

int
main()
{
    while (std::cin.good()) {
        std::string s;
        if (std::cin >> s) {
            std::cout
                << "The input is " << s
                << " and the size is " << s.length()
                << std::endl;
        }
    }
    return 0;
}

它不使用数组,但它是解决此类问题的首选方法。一般情况下,您应该尝试使用std::stringstd::vector替换原始数组,原始指针包含shared_ptrscoped_ptrshared_array,最重要的是适当的),snprintfstd::stringstream。这是简单编写更好的C ++的第一步。你将来会感谢你自己。我希望几年前我听过这个建议。

答案 5 :(得分:0)

试试吧

template < typename T, unsigned N >
unsigned sizeOfArray( T const (&array)[ N ] )
{
return N;
}