2013-05-06 67 views
1

我遇到了char數組大小的問題。我將一個char數組傳遞給函數,並且在運行該函數後,我仍然希望使用sizeof來檢查數組的大小,它不會給我數組的新大小,而是舊大小?我想知道爲什麼?非常感謝你!爲什麼字符數組的大小相同使用sizeof()

#include<iostream> 
using namespace std; 

void replacement(char* arr, int len){ 
    int count=0; 
    for(int i=0; i<len; i++){ 
    if(arr[i]==' '){ 
     count++; 
    } 
    } 
    int newlen=count*2+len; 
    //arr[newlen]='\0'; 
    int k=newlen-1; 
    for(int i=len-1; i>=0; i--){ 
    if(arr[i]!=' '){ 
     arr[k--]=arr[i]; 
    } 
    else{ 
     arr[k--]='0'; 
     arr[k--]='2'; 
     arr[k--]='%'; 
    } 
    } 
} 


int main(){ 
    char arr[]="ab c d e g "; 
    cout<<sizeof(arr)<<endl; 
    replacement(arr, sizeof(arr)); 
int i=0; 
    while(arr[i]!=NULL) cout<<arr[i]; 

} 
+1

可能重複[Sizeof數組作爲參數傳遞](http://stackoverflow.com/questions/1328223/sizeof-array-passed-as-parameter) – 2013-05-06 23:34:22

+1

@MatsPetersson不,這是不同的,他沒有使用參數上的'sizeof'。 – Barmar 2013-05-06 23:35:06

+0

'while(arr [i]!= NULL)cout << arr [i]; '是一個無限循環。 – 0x499602D2 2013-05-06 23:35:33

回答

3

您不能更改數組的大小。如果您想知道數組中字符串的長度,請使用strlen() - 這將計算空終止符之前的字符數。

更好的是使用C++ std::string類。

+0

你的意思是'std :: string' – 2013-05-06 23:38:35

+0

是的,而且由於他使用的是iostream,他肯定是在C++領域。 – 2013-05-06 23:40:21

+1

@CsabaToth他也有'使用命名空間std'。 – Barmar 2013-05-06 23:41:02

0

當編譯時已知大小時,可以使用sizeof()來查找僅靜態數組的大小。因此它總會返回在編譯時確定的數組大小。

0

程序在技術上具有未定義的行爲,因爲您使用sizeof會返回您的char陣列的字節大小。但是char隱含地包含空字節\0。這意味着for循環迭代1超過數組的長度。

建議您使用std::string以及size成員函數。

+0

我需要使用c字符串。謝謝。 – diane 2013-05-06 23:51:49

+0

@dianedan對不起,我的意思是'sizeof(arr)/ sizeof(char)'。 – 0x499602D2 2013-05-07 11:27:55

2

對,所以你試圖用「%20」替換空格,對吧?

由於C++(或C)不允許調整現有數組的大小,因此您需要首先擁有足夠的空間,或者使用在堆上分配的數組。然後在replacement函數中分配一個新的「替換」字符串並返回該字符串。

這樣做的正確的C++方法當然是使用std::string,在這種情況下,你可以只通過它作爲一個參考,而不要在現有的變量替換:

void replacement(std::string* str, int len){ 
    std::string perc20 = "%20"; 
    std::string space = " "; 
    while((pos = str.find(space, pos)) != std::string::npos) 
    { 
    str.replace(pos, space.length(), perc20); 
    pos += perc20.length(); 
    } 
} 

容易得多。 ..

相關問題