2012-01-14 17 views
3

私は文字配列としてC言語の文字列を扱っています。私はforループに値を動的に渡すことを保証しようとしています。C For Loop Not Working?

次のコードは動作しますが、全く問題:実際には

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

-strlen(fragments[2]) + 1strlen(fragments[1])の両方の値を確認していますeループになり、それぞれ-6と11にチェックアウトされます。明らかにループは、それらの値を直接場所に置くと機能しますが、私がstrlenの計算で2番目のものを置き換えると、それが壊れてしまい、私の人生の理由を理解できません。助けて?私はそれらを変更することはできませんので

編集

OverlapStrengthは定数としてその引数を取るので、私は、私が行くように、私は破片を変更していないよかなり確信しています。ここではメソッドの宣言です:フラグメントの

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

内容は重要ではありませんが、彼らは単に私が重複断片から戻って一緒につなぎしようとしている文字列をしています。私はすでに私のフラグメントがすべて正しく出ていることをチェックしており、このループを宣言する以外では長さが正しく計算されていることを確認しています。

+6

が '' strlenを(断片[1]) 'の値を変更OverlapStrength'んにstrlenをキャストすることができますか? –

+0

OverlapStrengthの引数は定数として宣言されているため、変更することはできません。そのコードを表示する元の投稿を編集します。 – Chiubaka

答えて

4

strlen戻り値、おそらくあなたのケースのためにunsigned intのtypedefです:

は、定数を使用し、これを修正するには。次に、 signed inti)と unsigned intstrlen(...))を比較しています。 Cは符号付きの値を符号なし型にキャストすることを決定します( default type promotionsのため)。 -6が符号なしintに変換された場合は 4294967290なので、比較はfalseなので、ループは終了します。

は、この問題を解決するには、例えば符号付きの値、例えば:

i < (int) strlen(fragments[1]) 
+0

ああ! OK、@ Femarefの回答はうまくいったけど、あなたが実際になぜ私に説明したのか。それは意味をなさない、私はそんなことは考えなかった。ありがとう! – Chiubaka

+0

リオリ、あなたは正しいです。それを見て、通常私はそれらのキャストを検出するプロです。 – Femaref

0

forループでは、コード化(​​部分)はすべての反復で評価されます。 OverlapStrengthfragments[1]の値をi未満に変更すると、ループは中止されます。タイプsize_t

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); 
} 
+1

私の推測では、 'OverlapStrength'はまったく実行されません。私の答えを見てください。しかし、あなたのコードは、strlenをintにキャストすることによって、この問題を偶然にも修正します。 – liori