2010-02-10 28 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; 
}