четверг, 13 ноября 2014 г.

Упражнение 2.5.

Напишите функцию any(s1, s2), которая возвращает либо ту позицию в s1, где стоит первый символ, совпавший с любым из символов в s2, либо -1 (если ни один символ из s1 не совпадает с символами из s2).

(Стандартная библиотечная функция strpbrk делает то же самое, но выдает не номер позиции символа, а указатель на символ.)

$ vim any.c

#include <stdio.h>
#define MAXLINE 1000

int getstr(char line[], int maxline);
int any(char s1[], char s2[]);

int main(void)
{
    char s1[MAXLINE];
    char s2[MAXLINE];
    int len;
    int pos;

    printf("Введите строку s1:\n");
    while ((len = getstr(s1, MAXLINE)) == 0)
        ;

    printf("Введите строку s2:\n");
    while ((len = getstr(s2, MAXLINE)) == 0)
        ;

    pos = any(s1, s2);
    printf("Позиция первого совпавшего символа %d\n", pos);

    return 0;
}

int getstr(char s[], int lim)
{
    int c, i;

    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
        s[i] = c;
    if (c == '\n')
        s[i++] = c;
    s[i] = '\0';        /* в конец строки дописываем "0" */
    return i;   /* функция возвращает длину строки */
}

/* any:  возвращает либо ту позицию в s1, где стоит первый символ, совпавший с любым символом в s2,
 * либо -1 (если ни один символ из s1 не совпадает с символами из s2) */
int any(char s1[], char s2[])
{
    int i, j;

  /* Перебор символов, совпадение которых пытаемся найти (массив s1) */
    for (i = 0; s1[i] != '\0'; i++)
    {
        /* Перебор символов, совпадение с которыми пытаемся найти (массив s2) */
        for (j = 0; s2[j] != '\0'; j++)
        {
            /* сравнение символов +
             * исключение символа новой строки ('\n'), так как он есть в обоих массивах */
            if (s1[i] == s2[j] && s1[i] != '\n')
            {
                printf("debug info i:%d\tj:%d\ts1[i]:%c\ts2[j]:%c\n", i, j, s1[i], s2[j]);
                return i;
            }
        }
    }
    return -1; /* если ни один символ из s1 не совпадает с символами из s2 */
}
$ cc -g -O0 -Wall -o a.out any.c
$ ./a.out
Введите строку s1:
qwerty
Введите строку s2:
e
debug info i:2  j:0     s1[i]:e s2[j]:e
Позиция первого совпавшего символа 2
$ ./a.out
Введите строку s1:
qwerty
Введите строку s2:
pass
Позиция первого совпавшего символа -1

Комментариев нет:

Отправить комментарий