Заменить функцию 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 шт):
Ну все же предельно просто!
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]);
}
Не знаю зачем, т.к. товарищ 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]);
По крайней мере в 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;})))
Зачем такая глазодробительная штука (ну, кроме как прикрытая макросом (в самом деле, внутри макросов этот стиль вполне уместен)) может на практике пригодиться -- ума не приложу....