1 Востаннє редагувалося prime333 (15.01.2015 18:17:50)

Тема: Задача з Керніган Річі

Пробую розв"язати задачу з  книги Кернігана Річі: Напишіть функцію any(s1, s2), яка повертає ту позицію в s1, де стоїть перший символ, що співпадає з будь-яким з s2, або -1(якщо жоден символ з s1 не співпадає з символами з s2). Розв"язок цієї задачі є в неті. Я написав свій варіант. Але ця функція завжди повертає -1. І чому, не можу зрозуміти.

2

Re: Задача з Керніган Річі

Ми теж не можемо зрозуміти, чому у вас завжди -1. Це складно.

Подякували: koala, Blast2

3

Re: Задача з Керніган Річі

Перепрошую я прикріпив файл .с, його хтось бачить?

4

Re: Задача з Керніган Річі

prime333 написав:

Перепрошую я прикріпив файл .с, його хтось бачить?

Ніхто не бачить, краще викладіть код прямо у повідомленні, скористувавшись теґом [ code ]

Подякували: prime3331

5

Re: Задача з Керніган Річі

int any(char s1[], char s2[]){
    int i, j;
    i = j = 0;
    while (s1[i] != '\0'){
        while (s2[j] != '\0'){
            if (s1[i] == s2[j++])
                return i;
        }
        i++;
    }
    return -1;
}

6

Re: Задача з Керніган Річі

'\0' - краще просто використовуйте 0 або NULL
і щось мені сі здає що перший символ воно не перевіряє, бо s2[j++] робиться спочатку j++, т.е. 0+1=1 (я можу помилятись)

Подякували: quez1

7 Востаннє редагувалося quez (15.01.2015 18:34:45)

Re: Задача з Керніган Річі

Але ця функція завжди повертає -1

Не завжди. http://ideone.com/ckftOo

8

Re: Задача з Керніган Річі

Використовуйте ++j та обнуляйте j в зовнішньому циклі кожного разу. А то перевірили першу літеру з майже усіма, а всі інші порівнюєте з нулем.

Подякували: Chemist-i, prime3332

9

Re: Задача з Керніган Річі

Спробував NULL, але результат той же :(

10

Re: Задача з Керніган Річі

Дякую quez! Коли додав j=0; в зовнішньому циклі все запрацювало.

11

Re: Задача з Керніган Річі

Chemist-i написав:

'\0' - краще просто використовуйте 0 або NULL

Навпаки: '\0' - це нульовий символ. 0 - це число 0. NULL - це нульовий вказівник. У вас рядок із символів, чисел чи вказівників? Ну то так і пишіть, все вірно.

Подякували: Chemist-i1

12

Re: Задача з Керніган Річі

Chemist-i написав:

'\0' - краще просто використовуйте 0 або NULL
і щось мені сі здає що перший символ воно не перевіряє, бо s2[j++] робиться спочатку j++, т.е. 0+1=1 (я можу помилятись)

j++ повертає старе значення j, після чого збільшує його на 1.
++j спершу збільшує, потім повертає збільшене значення.
Тобто, помилка не в цьому.

Справжня помилка: j треба обнуляти перед внутрішнім циклом (чи після нього). Бо так воно дійшло до кінця другого рядка, коли шукало перший символ першого рядка, а для наступних символів цикл перевірки не виконується.

13

Re: Задача з Керніган Річі

quez написав:

Використовуйте ++j та обнуляйте j в зовнішньому циклі кожного разу. А то перевірили першу літеру з майже усіма, а всі інші порівнюєте з нулем.

І хто б ото заборонив мені писати повідомлення під вечір?.. Що не вечір, то якийсь тупняк.