Заменить функцию strchr

На что можно заменить strchr в коде? Чтобы было более примитивно, без функций. Буду благодарен, если поможете

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str_in[30], * del;
    char zn[] = ".,:!?-;";
    int stats[7] = {0};
    fgets(str_in,sizeof(str_in),stdin);
    for(int i = 0; str_in[i]; i++)
    {
        if ((del = strchr(zn, str_in[i]))) // в этой строке заменить strchr(zn, str_in[i])
            stats[del-zn] += 1;
        if (str_in[i] == '.')
            break;
    }
    for(int i = 0; zn[i]; i++)
        printf("%c = %d\n", zn[i], stats[i]);
}


Ответы (3 шт):

Автор решения: Harry

Ну все же предельно просто!

char * strchr(char * s, char c)
{
    if (s == NULL) return NULL;
    for(;*s;++s) if (*s == c) return s;
    return NULL;
}

Раз надо не просто разжевать, но и проглотить...

#include <stdio.h>
#include <stdlib.h>

char * this_is_not_strchr(char * s, char c)
{
    if (s == NULL) return NULL;
    for(;*s;++s) if (*s == c) return s;
    return NULL;
}
int main()
{
    char str_in[30], * del;
    char zn[] = ".,:!?-;";
    int stats[7] = {0};
    fgets(str_in,sizeof(str_in),stdin);
    for(int i = 0; str_in[i]; i++)
    {
        if ((del = this_is_not_strchr(zn, str_in[i]))) // в этой строке заменить strchr(zn, str_in[i])
            stats[del-zn] += 1;
        if (str_in[i] == '.')
            break;
    }
    for(int i = 0; zn[i]; i++)
        printf("%c = %d\n", zn[i], stats[i]);
}
→ Ссылка
Автор решения: Miracle-

Не знаю зачем, т.к. товарищ Harry ответил, но надеюсь, после этого, вы начнете разбираться в терминах:

    char str_in[30];
    char zn[] = ".,:!?-;";
    int stats[7] = { 0 };
    fgets(str_in, sizeof(str_in), stdin);

    for (int i = 0; str_in[i]; i++)
    {
        for (int j = 0; zn[j]; j++) {
            if (zn[j] == str_in[i]) {
                stats[j] += 1;
                break;
            }
        }
    }
    for (int i = 0; zn[i]; i++)
        printf("%c = %d\n", zn[i], stats[i]);
→ Ссылка
Автор решения: avp

По крайней мере в gcc внутри скобочного выражения можно писать код в блоке из фигурных скобок.

Вот так: ({ C code here })

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

Таким образом вашу строку с strchr()

if ((del = strchr(zn, str_in[i]))) // в этой строке заменить strchr(zn, str_in[i])

можно заменить на следующий код без вызова strchr()

if ((del = ({char *p = zn; while (*p && *p != str_in[i]) p++; *p ? p : 0;})))

Зачем такая глазодробительная штука (ну, кроме как прикрытая макросом (в самом деле, внутри макросов этот стиль вполне уместен)) может на практике пригодиться -- ума не приложу....

→ Ссылка