[英]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.