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)? 我以为他们应该是一样的。
答案 0 :(得分:0)
从数组a
开始在C ++中无效,因为C ++没有variable-length arrays。不过有些编译器将其添加为扩展,因此让我们继续该假设。
变量ASize1
初始化为字符串{em>除以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
,而矢量长度并没有完成。
要获得正确的向量长度,您需要以正确的大小开始创建,或者以空向量开始然后添加值。
答案 1 :(得分:0)
您使用的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 );
}