Способы подсчёта вхождений заданного символа в строке
Модератор: Модераторы разделов
Способы подсчёта вхождений заданного символа в строке
Всем привет!
Может вопрос глупый, но все таки.
Я пытаюсь написать функцию подсчета вхождений определенного числа символов в строке. Собственно интересует какие есть варианты реализации в C ? Я так понимаю php-strpos и аналогов в C нету. Мой вариант: проходить циклом и сравнивать на соответствие символы Мне кажется это как то не по-куллхацкерски) и я не думаю что с точки зрения производительности это самый верный вариант.
Спасибо.
Может вопрос глупый, но все таки.
Я пытаюсь написать функцию подсчета вхождений определенного числа символов в строке. Собственно интересует какие есть варианты реализации в C ? Я так понимаю php-strpos и аналогов в C нету. Мой вариант: проходить циклом и сравнивать на соответствие символы Мне кажется это как то не по-куллхацкерски) и я не думаю что с точки зрения производительности это самый верный вариант.
Спасибо.
Re: Способы подсчёта вхождений заданного символа в строке
хай.
Впринципе можно организовать рекурсию, как это сделано например здесь. Но с точки зрения производительности цикл я думаю будет быстрее.
Впринципе можно организовать рекурсию, как это сделано например здесь. Но с точки зрения производительности цикл я думаю будет быстрее.
Спасибо сказали:
- Bizdelnick
- Модератор
- Сообщения: 20752
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Способы подсчёта вхождений заданного символа в строке
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Способы подсчёта вхождений заданного символа в строке
Тогда уж strchr или strpbrk - в зависимости от того, что на самом деле требуется.
И - все эти функции работают не с символами, а байтами. Это теперь не одно и то же. Но это уже другая история.
Re: Способы подсчёта вхождений заданного символа в строке
s.xbatob
Кстати, strstr() отлично работает с символами utf8 в силу особенностей этой кодировки.
Кстати, strstr() отлично работает с символами utf8 в силу особенностей этой кодировки.
Спасибо сказали:
- Bizdelnick
- Модератор
- Сообщения: 20752
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Способы подсчёта вхождений заданного символа в строке
Неужели с другими UTF не работает?
ТС просил аналог
а это таки strstr().
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
Re: Способы подсчёта вхождений заданного символа в строке
Ok, спасибо.
Вроде разобрался.
Не понял только
Вроде разобрался.
Не понял только
И - все эти функции работают не с символами, а байтами. Это теперь не одно и то же. Но это уже другая история.
Re: Способы подсчёта вхождений заданного символа в строке
Andrc char - это байт, куда зарегистрированные на настоящее время миллион с хвостиком символов никак не поместятся.
Поэтому придуманы различные методы их представления в виде последовательности байт, и по уму всё приходящее из внешнего мира надо сначала декодировать в массивы wchar_t, и работать уже с ними. А по окончании ещё и кодировать обратно.
А если не декодировать, и работать со внешнем представлением, тогда надо хорошо понимать, что делаешь, и чем это чревато.
Поэтому придуманы различные методы их представления в виде последовательности байт, и по уму всё приходящее из внешнего мира надо сначала декодировать в массивы wchar_t, и работать уже с ними. А по окончании ещё и кодировать обратно.
А если не декодировать, и работать со внешнем представлением, тогда надо хорошо понимать, что делаешь, и чем это чревато.
Спасибо сказали:
Re: Способы подсчёта вхождений заданного символа в строке
Сюрприз?
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: Способы подсчёта вхождений заданного символа в строке
Да, действительно, это я не подумавши ляпнул.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Способы подсчёта вхождений заданного символа в строке
Кстати, strstr() работает с символами utf8 только потому, что разыскивается полный фрагмент строки (целое число мультибайтных символов).
А strchr() работать не будет...
А strstr() намного длиннее и неэффективнее strchr()...
Одним словом - лажа всё это!
Работать с локализованными символами (русскими, китайскими, арабскими, ...) в виде представления их char[ ] нельзя, некорректно...
Т.е. можно, но только в том случае, когда со строкой обращаются как с единым целым ... например, ввод-вывод: ввели ... и в таком же виде позже вывели на терминал.
Во всех остальных случаях, когда нужно разбирать контекст, содержимое строки, искать позиции, ... да длину просто - нельзя.
А нужно использовать:
- тип символа wchar_t, строки wchar_t[ ], строчные функции wcs*() (аналоги str*()), и преобразования многобайтных представлений в широкие символы функциями группы mb*() - это всё в стиле языка C...
- тип wstring, операции ввода-вывода с потоками wcout, wcin и т.д.... - это в стиле языка C++
P.S. К сожалению, вся эта кухня очень плохо описана в литературе, потому как англоязычных авторов она сильно не занимает...
Спасибо сказали: