繁体   English   中英

s.length 和 sizeof(a) 有什么区别?

[英]What is the difference between s.length and sizeof(a)?

string s;
cin>>s;
int a[s.length()];
for(int i=0,j=0;i<s.length();i=i+2,j++)
{
    a[j] = s[i]-48;
}

int Asize1 = s.length()/2+1; //3
int Asize = sizeof(a)/sizeof(a[0]); //5

为什么这两个语句给出不同的结果(3 & 5)? 我以为他们应该是一样的。

首先你的数组a在 C++ 中是无效的,因为 C++ 没有可变长度数组 一些编译器将它添加为扩展,所以让我们继续这个假设。

变量ASize1被初始化为字符串的长度除以2然后加上1 所以你并没有真正检查同样的事情。

如果字符串的长度为5 ,那么s.length() / 2 + 1将是5 / 2 + 1 ,即2 + 1 ,实际上是3

假设编译器“正确”地实现了 VLA,那么表达式sizeof(a) / sizeof(a[0])将等于(5 * sizeof(int)) / sizeof(int) ,这将是预期的5


为了完整起见,让我们用std::vector<int>代替,使用问题中显示的代码的等效性:

string s;
cin>>s;
std::vector<int> a(s.length());
for(int i=0,j=0;i<s.length();i=i+2,j++)
{
    a[j] = s[i]-48;
}

int Asize1 = s.length()/2+1; //3
int Asize = a.size(); //5

如果输入字符串是五个字符,那么我的解释仍然成立(除了它是a.size()返回5 )。 数字之间的差异是因为您将字符串的长度除以2并添加1 ,这不是对向量长度进行的。

要获得合适的向量长度,您需要以正确的大小开始创建它,或者从一个空向量开始,然后添加值。

您使用了在 C++ 中无效的 C 功能 - 可变长度数组。 无论如何,在数组上使用或不使用它的操作都不会改变它的大小(由sizeof()返回),并且您在该循环中进行了多少次赋值无关紧要。 为了正确的逻辑使用std::vector保持大小:

string s = "3+2+1";
std::vector<int> v;
for(int i=0;i<s.length();i+=2)
{
    v.push_back( s[i]-48 );
}

实时代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM