Функция memchr

Содержание

#include <string.h>
void *memchr(const void *buffer, int ch, size_t count);

Функция memchr() просматривает массив, адресуемый параметром buffer, чтобы отыскать первое вхождение символа ch в первых count символах.

Эта функция возвращает указатель на первый из символов ch, входящих в массив buffer, или нулевой указатель, если символ ch не найден.

Пример


Данная программа выводит на экран сообщение из примера.

#include <stdio.h>
#include <string.h>

int main(void)
{
  char *p;

  p = memchr("строка из примера", ' ', 17);
  printf(p);

  return 0;
} 

Еще один пример


Некоторые примеры, приведенные в качестве иллюстрации применения строковых функций, иногда носят «несколько учебный» характер и не всегда могут быть рекомендованы для профессионального программирования. Например, указание константы 17 в операторе

p = memchr("строка из примера", ' ', 17);

предыдущего примера едва ли может служить хорошим примером для программиста. (Кстати сказать, против подобного употребления констант автор предупреждал читателей в предыдущих главах. Просто в данной программе автор не хотел «затенять» основную идею посторонними деталями.) Подумайте, что будет, если изменить строку? Опять подсчитывать количество символов? Чтобы избежать этого, во многих руководствах предлагается использовать для этой цели функцию strlen. Вот какой пример применения приводится, например, в документации по Borland C++ Builder 5:

#include <stdio.h>
#include <string.h>

int main(void)
{
  char str[17];
  char *ptr;

  strcpy(str, "This is a string");
  ptr = (char *) memchr(str, 'r', strlen(str));

  if (ptr)
    printf("The character 'r' is at position: %d\n", ptr - str);
  else
    printf("The character was not found\n"); return 0;
}

В данном примере, правда, константа указана в объявлении массива str. Однако этого можно было легко избежать, проинициализировав массив в объявлении. Правда, остается еще один недостаток: некоторое снижение эффективности кода из-за вызова функции strlen. Но и его можно устранить, если длина строки может быть вычислена при компиляции (как в наших примерах). Действительно, тогда ведь можно воспользоваться операцией sizeof и записать не константу 17, а константное выражение sizeof (str) /sizeof (char). (Отсюда вывод: никогда не верьте тем, кто говорит, что последовательное применение технологии программирования приводит к ухудшенению характеристик программы. Если язык программирования хорошо сконструирован, то ничего подобного быть не может. Правда, если язык продуман плохо… то едва ли стоит на нем писать программы!).

Зависимые функции


memcpy() isspace()