我遇到了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];
}
答案 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
成员函数。