C для цикла не работает? - PullRequest
       20

C для цикла не работает?

3 голосов
/ 14 января 2012

Я работаю со строками в 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);
}

Я проверилзначения для -strlen(fragments[2]) + 1 и strlen(fragments[1]) непосредственно перед циклом, и они проверяются на -6 и 11 соответственно.Ясно, что цикл работает, когда я помещаю эти значения непосредственно на их места, но когда я заменяю второе значение вычислениями strlen, он ломается, и я не могу понять, почему для моей жизни.Справка?

Редактировать

OverlapStrength принимает свои аргументы в качестве констант, поэтому я не могу их изменить, поэтому я почти уверен, что не изменяю фрагменты, так как яидти.Вот объявление метода:

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

Содержимое фрагментов не должно быть важным, но это просто строки, которые я пытаюсь собрать обратно из перекрывающихся фрагментов.Я уже проверил, что все мои фрагменты выводятся правильно и что их длины вычисляются правильно, когда это делается вне объявления этого цикла.

Ответы [ 2 ]

4 голосов
/ 14 января 2012

strlen возвращает значение типа size_t, которое, вероятно, является typedef для unsigned int для вашего случая. Затем вы сравниваете signed int (i) и unsigned int (strlen(...)). Затем C решает преобразовать ваше подписанное значение в тип без знака (из-за продвижения по умолчанию для типа ). -6, преобразованное в unsigned int, равно 4294967290, поэтому ваше сравнение неверно, поэтому цикл заканчивается.

Чтобы это исправить, вы можете, например, привести strlen к знаковому значению, например ::

i < (int) strlen(fragments[1])
0 голосов
/ 14 января 2012

В цикле 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);
}
...