使用sizeof()为什么char数组的大小相同

时间:2013-05-06 23:32:44

标签: c++ arrays

我遇到了char数组大小的问题。我将一个char数组传递给函数并运行该函数后,我仍然想使用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];  

}

4 个答案:

答案 0 :(得分:3)

您无法更改数组的大小。如果您想知道数组中字符串的长度,请使用strlen() - 这将计算空终止符之前的字符数。

更好的方法是使用C ++ std::string类。

答案 1 :(得分: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();
   }
}

更容易......

答案 2 :(得分:0)

在编译时已知大小时,可以使用sizeof()查找仅静态数组的大小。因此,它总是返回在编译时确定的数组大小。

答案 3 :(得分:0)

您的程序在技术上具有未定义的行为,因为您使用sizeof会返回char数组的字节大小。但是char隐式包含空字节\0。这意味着for循环迭代1超过数组的长度。

建议您改为使用std::string及其size成员函数。