3

私は C で文字列を文字配列として扱っており、値を for ループに動的に渡すことができるようにしようとしています。

次のコードは機能しますが、問題ありません。

for (int i = -6; i < 11; i++) {
    int test = OverlapStrength(fragments[1], fragments[2], i, 0);
    printf("%d\n", test);
}

実際、次のコードも機能します。

for (int i = -strlen(fragments[2]) + 1; i < 11; i++) {
    int test = OverlapStrength(fragments[1], fragments[2], i, 0);
    printf("%d\n", test);
}

しかし、何らかの理由で、このコードは何も出力しません:

for (int i = -strlen(fragments[2]) + 1; i < strlen(fragments[1]); i++) {
    int test = OverlapStrength(fragments[1], fragments[2], i, 0);
    printf("%d\n", test);
}

ループの直前と両方の値をチェックしたところ、それぞれ -6 と 11 にチェックアウトされまし-strlen(fragments[2]) + 1た。strlen(fragments[1])これらの値を直接その場所に配置するとループが機能することは明らかですが、2番目の値をstrlen計算に置き換えるとループが壊れ、私の人生の理由を理解できません. ヘルプ?

編集

OverlapStrength はその引数を定数として受け取るため、それらを変更することはできません。したがって、途中でフラグメントを変更していないことは確かです。メソッド宣言は次のとおりです。

int OverlapStrength(const char one[], const char two[], int startOne, int startTwo)

フラグメントの内容は重要ではありませんが、重複するフラグメントからつなぎ合わせようとしている単なる文字列です。フラグメントがすべて適切に出力され、このループの宣言以外でフラグメントの長さが適切に計算されることを確認しました。

4

2 に答える 2

4

strlentype の値を返します。これはおそらくあなたのケースsize_tの typedef です。次に、 ( ) と( )unsigned intを比較しています。次に、C は、符号付きの値を符号なしの型にキャストすることを決定します (デフォルトの型 Promotionsのため)。unsigned int に変換されるため、比較が false になり、ループが終了します。signed intiunsigned intstrlen(...)-64294967290

これを修正するにはstrlen、たとえば次のように符号付きの値にキャストできます。

i < (int) strlen(fragments[1])
于 2012-01-14T17:43:16.453 に答える
0

for ループでは、i < strlen(fragments[1])反復ごとにコード (部分) が評価されます。の値をより小さいOverlapStrength値に変更すると、ループは中止されます。fragments[1]i

これを修正するには、定数を使用します。

int loopUntil = strlen(fragments[1]);
for (int i = -strlen(fragments[2]) + 1; i < loopUntil; i++) {
    int test = OverlapStrength(fragments[1], fragments[2], i, 0);
    printf("%d\n", test);
}
于 2012-01-14T17:41:04.997 に答える