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

时间:2018-08-23 17:43:53

标签: c++ string

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)? 我以为他们应该是一样的。

2 个答案:

答案 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 );
}

live code