为什么我在字符串和向量上得到两个不同的结果

时间:2013-07-18 23:02:51

标签: c++ c

我有两个字符串s1:"abcd"和s2:"ab"和两个int向量v1:12,13,14,15和v2:12,13。我正在计算两个字符串和两个向量之间的距离。我从网上获得了c文件的代码来计算两个字符串之间的距离。我正在修改代码以计算两个向量之间的距离,但是在c++中。代码正在运行,但结果并不相同 (两次计算的距离应相同)。问题来自:

double transpositions = 0.0;    
for (i = 0; i < s1_len; i++) {
    if (!s1_matches[i]) continue;
    while (!s2_matches[k]) k++;
    if (s1[i] == s2[k]) transpositions++;
    k++;
}

s1_lens1_len(s1)(s2相同),s1_matchint *s1_matches = (int*) calloc(s1_len, sizeof(int))。 我正在使用正确的答案运行c代码,但是当我将代码更改为c++并将字符串变量更改为向量变量时,我获得的transposition的数字是不同的。 要将字符串更改为矢量,我会将v1_len的矢量(v1.size())和v1_match的{​​{1}}的大小调整为int *v1_matches = (int*) calloc(v1_len, sizeof(int))。 代码完全相同:

double transpositions = 0.0;    
for (i = 0; i < v1_len; i++) {
    if (!v1_matches[i]) continue;
    while (!v2_matches[k]) k++;
    if (v1[i] == v2[k]) transpositions++;
    k++;
}

这里有什么问题?

1 个答案:

答案 0 :(得分:4)

您似乎没有对s2_matchesv2_matches进行任何边界检查。当s1s2不相同时,这会有未定义的行为:

while (!s2_matches[k]) k++;
if (s1[i] == s2[k]) transpositions++;
k++;

ie 您永远不会检查k溢出s2s2_matches的范围。与矢量版本相同。