2010-02-10 37 views
1
#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如何获得数组中已用空间的大小? (NOT sizeof); C++


而我希望它得到的已用空间的大小阵列。因此,对于最后输入我希望它输出:ARR的输入是34和数组的大小是2


谁能告诉我怎么样?

+2

注意,你的代码会爆炸,如果有人进入超过199个字符。另一个在C++代码中使用'std :: string'优先于旧式C-string的原因。 – 2010-02-10 00:18:11

回答

4

也许你想strlen(arr)在这里。它必须以空终止,否则cout << arr将无法​​工作。

您将需要#include <cstring>

+0

它的工作感谢:D – magiix 2010-02-10 00:15:51

+2

这是正确的。你实际上在做的是读取一个C字符串,并且你想知道字符串是多长时间(而不是多少“被使用” - 这不是一个有意义的概念)。但请注意我说的:* C *字符串。为什么你使用C字符串,如果这是C++代码?使用'std :: string',你会节省很多时间和头发。 – 2010-02-10 00:17:10

+0

好泰勒这不是代码,我需要在另一个功能这个东西我一直在工作1,5小时,所以我不需要改变这一切 – magiix 2010-02-10 00:20:26

1

在一般情况下没有自动的方法来做你想做的事情 - 你需要跟踪某种方式,或者用你自己的计数器,或者用一个'无效'值(你定义的)给数组播种,搜索以查找使用过的元素的末尾(这是C样式字符串中'\ 0'终止符字符所在的位置)。

在你发布的示例代码中,数组应该接收到一个以null结尾的C风格的字符串,你可以使用这些知识来计算有效元素的数量。

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

0

阵列

的使用空间的大小有没有这样的事情。如果你有200个字符的数组,那么你有200个字符。数组没有“已用”和“未用”空间的概念。它仅适用于C字符串,因为这些字符以0字符结尾。但是再次,数组本身不知道它是否持有C字符串。

0

以较少涉及的方式,您可以对每个字符进行计数,直到您仅用一段时间循环就可以打到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; 
} 
+0

注意:像我一样将你的“int i”移到循环外部。 – 2010-02-10 01:01:58

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++的第一步。你将来会感谢你自己。我希望几年前我遵循了这个建议。

0

试试吧

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