Easyelectronics.ru

Электроника для всех
Текущее время: 27 сен 2020, 23:16

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Си. Распознать строку в массиве.
СообщениеДобавлено: 21 апр 2015, 22:47 
Здравствуйте!

Зарегистрирован: 21 апр 2015, 22:30
Сообщения: 1
Сильно не пинайте....
Хочу найти простой способ распознавания слова в массиве символов.
Есть массив buf[500] и в нем среди символов может находиться слово 'OK'\r\n, 'False'\r\n, 'Error'\r\n итд. И если это слово там есть, я хочу об этом знать. Есть ли стандартный способ в Си такой как sscanf.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Распознать строку в массиве.
СообщениеДобавлено: 21 апр 2015, 22:50 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
strstr, но не припомню, чтобы ей хоть кто-то пользовался.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Распознать строку в массиве.
СообщениеДобавлено: 22 апр 2015, 00:39 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4946
Откуда: Донецк-Мариуполь
В Си строка оканчивается "нуль-символом", поэтому всякие "переводы-строки" и "возврат-каретки" считаются за обычный символ. Функция strstr() - самая что ни на есть стандартная.
Если ищется в массиве символов, то нужно позаботиться, чтобы он заканчивался "нуль-символом".

...
char *buf[500];
char KeyWord[20];
char *pk;
...
buf[499] = '\0';
strcpy( KeyWord, "Error\r\n" );
pk = strstr(buf, KeyWord );
if ( pk == NULL )
{ ... не нашли ... }
else
{ Bingo!!!}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Распознать строку в массиве.
СообщениеДобавлено: 22 апр 2015, 07:12 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2880
strstr прекрасно работает, возвращает указатель на байт, где начало искомой строки. на AVR можно strstr_P, чтобы лишнюю оперативку не пользовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Распознать строку в массиве.
СообщениеДобавлено: 22 апр 2015, 10:17 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 2471
paramen писал(а):
Сильно не пинайте....
Хочу найти простой способ распознавания слова в массиве символов.
Есть массив buf[500] и в нем среди символов может находиться слово 'OK'\r\n, 'False'\r\n, 'Error'\r\n итд. И если это слово там есть, я хочу об этом знать. Есть ли стандартный способ в Си такой как sscanf.

Можно заюзать strstr, как упоминали выше, но лучше реализовать что-то более адекватное. Например такое http://www8.cs.umu.se/~isak/snippets/bmhsrch.c . И вообще бывает полезно заглядывать вот сюда http://www8.cs.umu.se/~isak/snippets/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Распознать строку в массиве.
СообщениеДобавлено: 22 апр 2015, 12:09 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
а можно поиграться с алгоритмом Ахо-Корасика. Там так любимые некоторыми форумчанами конечные автоматы )

Википедия: Алгоритм Ахо — Корасик


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Распознать строку в массиве.
СообщениеДобавлено: 22 апр 2015, 13:25 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4946
Откуда: Донецк-Мариуполь
@#$!#$ !!! Топик-стартер, скорее всего, новичок в Си, и ему достаточно будет стандартной strstr(), а вы ему голову забиваете супер-алгоритмами?

Или типа "а поговорить?" )))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Распознать строку в массиве.
СообщениеДобавлено: 22 апр 2015, 13:57 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
Проблемы кодеров выучивших язык и пару стандартных фреймворков - отсутствие понимания алгоритмов и представления о том, что есть какие-то другие методы.

Да, поиск простым перебором будет работать. И, возможно, в данной задаче это вообще не критично. Но как только изменятся условия - например, нет входного буфера достаточной длины и надо анализировать налету - тут стандартные подходы проскальзывают, и решение начинает обрастать костылями.

И вообще, алгоритм и язык связаны очень слабо, и хотя бы для общего развития стоит понимать, чем хорош, а чем плох qsort()

Ну и поговорить, конечно )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Распознать строку в массиве.
СообщениеДобавлено: 22 апр 2015, 18:57 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 2471
kitekat писал(а):
@#$!#$ !!! Топик-стартер, скорее всего, новичок в Си, и ему достаточно будет стандартной strstr(), а вы ему голову забиваете супер-алгоритмами?

На МК, обычно, не так много процессорных ресурсов, что бы тратить их на пустопорожнее перемалывание байтов. Так что хороший алгоритм не повредит. Ну и даже если человек новичек, это еще не повод не говорить ему о том, что есть правильные решения, а не только "в лоб" :)

Цитата:
Или типа "а поговорить?" )))


Куда ж без этого? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си. Распознать строку в массиве.
СообщениеДобавлено: 24 апр 2015, 09:25 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3689
Откуда: Новосибирск
Steel.ne писал(а):
Там так любимые некоторыми форумчанами конечные автоматы

Опять двадцать пять. Уже не одну линейку сломали друг другу об макушки. :)
Моментально закончу спор. Пусть будет некий станок. Режимы этого станка: Стоп. Наладка. Автомат. Полуавтомат. Если какая-либо аварийная ситуация, соответственно - Аварийный режим. Добавим инициализацию. Итого 6 состояний. И скажите мне, какой вывод напрашивается? Будете городить флагами, потоковым программированием или же будем использовать самый простой и надежный способ, то есть, конечный автомат. Станок несложный, время реакции - можно спокойно уложиться в 20 мс. Нагородил простую карусельку из функций в main и вперед. Даже RTOS в данном случае не требуется.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB