开发者

How to get the size of the used space in an array? (NOT sizeof); 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;
}

For the input of 34, This code outputs :The arr input is 34 and the size of the array is 200


while I want it to get the size of the used space of the array . So for The last input i want it to ou开发者_C百科tput :The arr input is 34 and the size of the array is 2


Can someone tell me how?


Maybe you want strlen(arr) here. It must be null terminated, otherwise the cout << arr would not have worked.

You would need to #include <cstring>


There's no automatic way to do what you want in the general case - you'll need to keep track somehow, either with your own counter, or by seeding the array with an 'invalid' value (that you define) and search for to find the end of the used elements (that's what the '\0' terminator character in a C-style string is).

In the example code you posted, the array should receive a null terminated C-style string, you can use that knowledge to count the number of valid elements.

If you're using C++ or some other library that has some more advanced data structures, you may be able to use one that keeps track of this kind of thing for you (like std::vector<>).


the size of the used space of the array

There is no such thing. If you have an array of 200 chars, then you have 200 chars. Arrays have no concept of "used" and "unused" space. It only works with C-strings because of the convention that those are terminated by a 0 character. But then again, the array itself cannot know if it is holding a C-string.


in a less involved manner, you can just count through each character till you hit a null with just a while loop. It will do the exact same thing strlen() does. Also, in practice, you should do type checking with cin, but i'll assume this was just a test.

#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;
}


Just for completeness, here is a much more C++ like solution that is using std::string instead of a raw char array.

#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;
}

It doesn't use an array, but it is the preferable solution for this kind of problem. In general, you should try to replace raw arrays with std::string and std::vector as appropriate, raw pointers with shared_ptr (scoped_ptr, or shared_array, whatever is most appropriate), and snprintf with std::stringstream. This is the first step to simply writing better C++. You will thank yourself in the future. I wish that I had followed this advice a few years ago.


Try it

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜