Способы подсчёта вхождений заданного символа в строке

Модератор: Модераторы разделов

Ответить
Andrc
Сообщения: 2

Способы подсчёта вхождений заданного символа в строке

Сообщение Andrc »

Всем привет!

Может вопрос глупый, но все таки.
Я пытаюсь написать функцию подсчета вхождений определенного числа символов в строке. Собственно интересует какие есть варианты реализации в C ? Я так понимаю php-strpos и аналогов в C нету. Мой вариант: проходить циклом и сравнивать на соответствие символы:) Мне кажется это как то не по-куллхацкерски) и я не думаю что с точки зрения производительности это самый верный вариант.

Спасибо.

Спасибо сказали:
kasian
Сообщения: 4

Re: Способы подсчёта вхождений заданного символа в строке

Сообщение kasian »

хай.
Впринципе можно организовать рекурсию, как это сделано например здесь. Но с точки зрения производительности цикл я думаю будет быстрее.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Способы подсчёта вхождений заданного символа в строке

Сообщение Bizdelnick »

Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: Способы подсчёта вхождений заданного символа в строке

Сообщение s.xbatob »

Bizdelnick писал(а):
26.12.2015 00:09
man strstr

Тогда уж strchr или strpbrk - в зависимости от того, что на самом деле требуется.
И - все эти функции работают не с символами, а байтами. Это теперь не одно и то же. Но это уже другая история.
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Способы подсчёта вхождений заданного символа в строке

Сообщение bormant »

s.xbatob
Кстати, strstr() отлично работает с символами utf8 в силу особенностей этой кодировки.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Способы подсчёта вхождений заданного символа в строке

Сообщение Bizdelnick »

bormant писал(а):
26.12.2015 22:27
strstr() отлично работает с символами utf8

Неужели с другими UTF не работает?

s.xbatob писал(а):
26.12.2015 22:00
Тогда уж strchr или strpbrk

ТС просил аналог
Andrc писал(а):
25.12.2015 17:29
php-strpos
а это таки strstr().
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Andrc
Сообщения: 2

Re: Способы подсчёта вхождений заданного символа в строке

Сообщение Andrc »

Ok, спасибо.
Вроде разобрался.

Не понял только
И - все эти функции работают не с символами, а байтами. Это теперь не одно и то же. Но это уже другая история.

Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: Способы подсчёта вхождений заданного символа в строке

Сообщение s.xbatob »

Andrc char - это байт, куда зарегистрированные на настоящее время миллион с хвостиком символов никак не поместятся.
Поэтому придуманы различные методы их представления в виде последовательности байт, и по уму всё приходящее из внешнего мира надо сначала декодировать в массивы wchar_t, и работать уже с ними. А по окончании ещё и кодировать обратно.
А если не декодировать, и работать со внешнем представлением, тогда надо хорошо понимать, что делаешь, и чем это чревато.
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Способы подсчёта вхождений заданного символа в строке

Сообщение bormant »

Bizdelnick писал(а):
27.12.2015 23:15
Неужели с другими UTF не работает?

Сюрприз?

PS.

Код: Выделить всё

#include <string.h>
#include <stdio.h>
int main() {
  char *s_utf16 = "H\0i\0\0";
  char *s_utf32 = "H\0\0\0i\0\0\0\0\0\0";
  if (NULL==strstr(s_utf16,"i\0\0")) puts("UTF16: NULL");
  if (NULL==strstr(s_utf32,"i\0\0\0\0\0\0")) puts("UTF32: NULL");
  return 0;
}
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Способы подсчёта вхождений заданного символа в строке

Сообщение Bizdelnick »

Да, действительно, это я не подумавши ляпнул.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX
Контактная информация:

Re: Способы подсчёта вхождений заданного символа в строке

Сообщение Olej »

bormant писал(а):
26.12.2015 22:27
s.xbatob
Кстати, strstr() отлично работает с символами utf8 в силу особенностей этой кодировки.

Кстати, strstr() работает с символами utf8 только потому, что разыскивается полный фрагмент строки (целое число мультибайтных символов).
А strchr() работать не будет...
А strstr() намного длиннее и неэффективнее strchr()... :mellow:

Одним словом - лажа всё это!
Работать с локализованными символами (русскими, китайскими, арабскими, ...) в виде представления их char[ ] нельзя, некорректно...
Т.е. можно, но только в том случае, когда со строкой обращаются как с единым целым ... например, ввод-вывод: ввели ... и в таком же виде позже вывели на терминал.

Во всех остальных случаях, когда нужно разбирать контекст, содержимое строки, искать позиции, ... да длину просто - нельзя.
А нужно использовать:

- тип символа wchar_t, строки wchar_t[ ], строчные функции wcs*() (аналоги str*()), и преобразования многобайтных представлений в широкие символы функциями группы mb*() - это всё в стиле языка C...

- тип wstring, операции ввода-вывода с потоками wcout, wcin и т.д.... - это в стиле языка C++

P.S. К сожалению, вся эта кухня очень плохо описана в литературе, потому как англоязычных авторов она сильно не занимает...
Спасибо сказали:
Ответить