1

我遇到了 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

4 回答 4

3

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

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

于 2013-05-06T23:34:23.393 回答
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();
   }
}

容易多了...

于 2013-05-06T23:47:42.243 回答
0

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

建议您std::string与其size成员函数一起使用。

于 2013-05-06T23:43:50.460 回答
0

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

于 2013-05-06T23:39:28.347 回答