Решил задчку 4.12 из «Программирование: введение в профессию. Задачи и этюды» А.В. Столярова:
"Напишите функцию, которая в заданной строке находит вхождение заданной подстроки и, если таковое обнаружено, возвращает адрес (не индекс в массиве, а именно адрес!) начала подстроки в строке, если же заданная подстрока не обнаружена - возвращает NULL. Используя эту функцию, напишите программу, которая принимает на вход произвольное (не менее одного) количество аргументов командной строки, первый из них рассматривает как подстроку, и печатает:
a) те из оставшихся аргументов, которые содержат в себе эту подстроку (каждый на отдельной строке);
b) для каждого из аргументов, содержащих в себе подстроку - сам этот аргумент и количество вхождений в него указанной подстроки.
Обратите внимание, что написанной вами функции, если она соответствует спецификации, достаточно для решения обоих пунктов задачи, в том смысле что никакой дополнительный анализ строк здесь не нужен, можно вообще не обращаться к элементам строк ни напрямую, ни как-то ещё, кроме как через написанную функцию."
Программа получилась следующей:
/* num_of_pat_occur_in_cmd_line_args.c */
#include <stdio.h>
#include <string.h>
enum boolean { false, true };
enum boolean fit(const char *str, const char *pat)
{
for (; *pat; str++, pat++) {
if (*str != *pat)
return false;
}
return true;
}
const char *addr_of_occur(const char *str, const char *pat)
{
for (; *str; str++) {
if (*str == *pat) { /* start of pattern occurence */
if (fit(str, pat)) /* checking if the rest of the pattern */
return str; /* match */
}
}
return NULL;
}
int num_of_pat_occur(const char *str, const char *pat)
{
int n = 0;
while ((str = addr_of_occur(str, pat))) {
str = str + strlen(pat);
n++;
}
return n;
}
int main(int argc, char **argv)
{
char *pat;
int i;
if (argc == 0) {
printf(
"Please provide command line arguments: pattern and string(s)\n"
);
return 1;
}
pat = argv[1];
for (i=2; i < argc; i++) {
int n = 0;
n = num_of_pat_occur(argv[i], pat);
if (n > 0)
printf("%s - %d;\n", argv[i], n);
}
return 0;
}
Однако меня смущает тот факт, что в функции num_of_pat_occur
я использовал strlen
, хотя автор говорит что «можно вообще не обращаться к элементам строк ни напрямую, ни как-то ещё, кроме как через написанную (вами) функцию».
Возможно я что-то упустил?