2013-10-31 24 views
0

我正在爲我的計算機科學一門課程做一個項目,我無法獲得包含char值的數組的確切大小。首先,程序會提示用戶輸入char值,方法是使用行cin.getline(array,100);之後,它接受數組,然後向它傳遞一個getSize函數,該函數假定返回數組的實際大小。唯一的問題是它不是不一致的。有時它會返回正確的值,但其他時間則不會。 的getSize功能:如何查找字符數組中非空項目的數量。 C++

int getSize(char arr[]){ 
    int i = 0; 
    for(i; '\0' != arr[i];i++){ 
    } 
    return i; 
} 

實施例: ARR [100]包含5個字符,其餘都爲空,但是當程序運行時該函數返回7。我不確定這是否是一個問題,但程序在將數組發送給size函數之前會修改它。它刪除重複項。

+0

你可以舉一個例子說明它不一致的情況嗎? – rcs

+0

您可以在結果中顯示不一致嗎? – jester

+1

我認爲這有點令人困惑,因爲當你說大小時,你實際上是指在這種情況下非零元素的數量或字符串的長度。 –

回答

1
template<size_t t_size> 
size_t GetRealSize(const char (&str)[t_size]) 
{ 
    return std::count_if(&str[0], &str[t_size], [](char c) { return !!c; }); 
} 

這可能是你想要的。

+0

他希望返回的行的大小 – nishantjr

+0

@nishantjr,我的錯。我改變了我原來的答案。 – xmllmx

+0

到目前爲止,這是唯一符合具體問題的實際字母的答案,但我不相信OP甚至知道詢問什麼,或者他們甚至想要*在這一點上。 – WhozCraig

0

這不能單用指針來完成。指針不包含有關數組大小的信息 - 它們只是一個內存地址。由於數組在傳遞給函數時衰減爲指針,因此會丟失數組的大小。

一種方法是使用Templates

template <typename T, size_t N> 
size_t array(const T (&buffer)[N]) 
{ 
cout << "size: " << N << endl; 
return N; 
} 

然後,您可以調用函數這樣的(就像任何其他功能):

int main() 
{ 
char a[10]; 
array(a); 
} 

輸出:

size: 10 
+0

我會使用它,但我不認爲我想知道有關模板和指針呢.. – user2940061

4

由於你正在處理數組,使用strlen函數

strlen(array); 

注意,也有一個函數getline overload for strings這更類似於C++(面向對象等)

std::string line; 
std::getline(std::cin, line); 
size_t len = line.length(); 
0

,你可以很容易地使用sizeof()接線員給大小,...

,如果你有char a[10];

使用

int size=sizeof(a); 
+0

現在用'a'作爲函數參數來調用一個名爲'int getSize(char a [])的函數' 。 – WhozCraig

+0

只是試試.... – Raon

+0

OP是試圖從一個函數中獲取這個數組作爲一個單一的輸入參數。這不是那麼,所以*爲什麼*嘗試一些不符合問題的東西開始? – WhozCraig

相關問題