String find c не работает

string.find () не возвращает -1

Код ниже прост. Как я знаю, если string :: find () не находит совпадений, возвращается -1. Но по некоторым причинам приведенный ниже код не работает. Каждый раз, когда я запускаю этот код, я получаю бесконечный цикл. Спасибо за помощь!

Решение

Помимо других ответов, которые являются полностью правильными, я просто хотел добавить, что ваш цикл while все равно создал бы бесконечный цикл. Например:

будет бесконечный цикл, потому что он будет продолжать пытаться найти toReplace строка в text и он всегда найдет его (это потому, что поиск начинается с начала строки каждый раз). Это, вероятно, не то, что вы хотели.

Другие решения

std::string::find возвращается std::string::npos если искомая подстрока не найдена, не -1 , Точное значение npos определяется реализацией, поэтому используйте npos , как в

Подумать об этом, find не удалось вернуть -1, даже если бы захотелось, потому что указан тип возвращаемого значения find std::size_t который является неподписанный тип.

Кроме того, найти будет всегда искать первый появление подстроки, независимо от того, сколько раз вы ее называете. Если вы хотите перебрать все вхождения, вы должны использовать перегрузку find который принимает второй параметр — положение, с которого начинается поиск.

Кто бы ни сказал вам это или где бы вы ни читали, он солгал вам.

Если std::string::find не получается, возвращается std::string::npos , который не -1 ,

Вы должны проверить документацию о таких вещах, когда вы не уверены.

Так что ваши while будет что-то вроде:

По поводу вашего комментария:

ОБНОВЛЕНИЕ: я пытался использовать while (text.find (toReplace)! = String :: npos), но я все еще получаю бесконечный цикл 🙁 — user2167403 10 секунд назад

Вы должны действительно научиться читать документация . Используйте переменную для хранения последнего результата std::string::find (отличный от std::string::npos ) и использовать std::string::find второй параметр — pos (передавая значение — last_match_position + 1 ).

Опуская второй параметр, std::string::find всегда начинается с начала строки, что вызывает бесконечный цикл.

В приведенном вами фрагменте кода text переменная содержит подстроку «ijk», которая хранится в toReplace переменная. Пока в то время как цикл ни text или же toReplace При изменении переменных метод find всегда будет возвращать не значение -1, что является условием продолжения цикла.

Как уже упоминалось в других комментариях, вы должны проверять не -1, а std::string::npos ,

Это помогает прочитать страницу руководства (string :: npos — ответ).

Источник

unixforum.org

Форум для пользователей UNIX-подобных систем

  • Темы без ответов
  • Активные темы
  • Поиск
  • Статус форума

C++: функция find() (почему 4294967295?)

C++: функция find()

Сообщение ArkanJR » 21.10.2014 19:57

В качестве примера работы данной функции приводится программа:

В результате на экран выводится число 12.

Re: C++: функция find()

Сообщение Bizdelnick » 21.10.2014 20:10

в консол и
вку́пе (с чем-либо)
в общем
в ообще
в течени е (часа)
нович ок
нюанс
п о умолчанию
приемл емо
пробле ма
проб овать
тра фик

Re: C++: функция find()

Сообщение yoshakar » 21.10.2014 21:24

Re: C++: функция find()

Сообщение ArkanJR » 21.10.2014 21:42

Читайте также:  Как починить горловину у свитера

Всё равно мне неясно, почему результат:

— Да, это была ошибка, Кемп, огромная ошибка, что я взялся один за это дело. Напрасно потрачены силы, время, возможности. Один… Удивительно, как беспомощен человек, когда он один! Мелкая кража, потасовка — и всё.

© Г. Уэллс «Человек-невидимка»

Re: C++: функция find()

Сообщение yoshakar » 21.10.2014 21:48

Re: C++: функция find()

Сообщение ArkanJR » 21.10.2014 21:52

— Да, это была ошибка, Кемп, огромная ошибка, что я взялся один за это дело. Напрасно потрачены силы, время, возможности. Один… Удивительно, как беспомощен человек, когда он один! Мелкая кража, потасовка — и всё.

© Г. Уэллс «Человек-невидимка»

Re: C++: функция find()

Сообщение Bizdelnick » 21.10.2014 22:02

в консол и
вку́пе (с чем-либо)
в общем
в ообще
в течени е (часа)
нович ок
нюанс
п о умолчанию
приемл емо
пробле ма
проб овать
тра фик

Re: C++: функция find()

Сообщение drBatty » 25.10.2014 13:54

например если мы приводим к int64_t, и это реальный случай, т.к. именно этот тип имеет ptrdiff_t, например индексы C массивов.
т.е. если мы хотим перейти в массиве, и ожидаем, что a[-1] это прошлый эл-т, то он окажется ВНЕЗАПНО 4294967295м.

PS: я согласен с основной вашей мыслью, что надо сравнивать с константой string::npos

Скоро придёт
Осень

Re: C++: функция find()

Сообщение yoshakar » 27.10.2014 22:47

Источник

строка — метод поиска C ++ не работает

Я довольно новичок в c ++, поэтому мои извинения за недостаток знаний, однако по какой-то причине мой метод find не работает. Любая помощь будет отличной, вот код, который я использую.

Забыл упомянуть, код всегда печатает «ЭТО РАБОТАЕТ», даже если в строке нет «о».

Решение

Проблема здесь в вашем заявлении if. s21.find(«1») вернет индекс первого вхождения в строке соответствующей строки. Если не найдено совпадение, возвращается string::npos который является перечислением значения -1 , Если операторы вернут истину на всех числах, которые не равны нулю. Таким образом, вы должны проверить это против string::npos как это:

Другие решения

Возвращаемое значение std::string::find позиция первого символа найденной подстроки или std::string::npos если такая подстрока не найдена.

Вы должны использовать std::string::npos для сопоставления строк

Если вы хотите стать немного умным, std::string::npos самый большой unsigned int , или же 1111 1111 1111 1111 в двоичном формате (люди иногда сравнивают str.find () с int -1, хотя это не рекомендуется). Вы можете использовать этот битовый паттерн с небольшим побитовая манипуляция .

Переключение всех битов даст вам ненулевые значения для каждой битовой комбинации, КРОМЕ std::string::npos и, поскольку C ++ рассматривает все ненулевые значения как true Ваш if может быть на самом деле:

Источник

BestProg

Работа со строками. Класс string . Конструкторы класса. Функции assign() , append() , insert() , replace() , erase() , find() , rfind() , compare() , c_str() . Примеры

Содержание

Поиск на других ресурсах:

1. Какое назначение класса string в программах на C++?

Класс string предназначен для работы со строками типа char* , которые представляют собой строку с завершающим нулем. Класс string был введенн как альтернативный вариант для работы со строками типа char* . Строки, которые завершаются символом ‘\0’ еще называются C-строками. Поскольку, string есть классом, то можно объявлять объекты этого класса.

2. Какие модули (библиотеки) нужно подключить, чтобы использовать возможности класса string в MS Visual Studio C++?

Чтобы использовать возможности класса string в MS Visual Studio (C++), нужно подключить библиотеку и пространство имен std .

3. Каким образом осуществляется объявление переменной типа string ? Примеры

Объявление переменной типа string осуществляется точно так же как и обычной переменной. Возможный вариант объявления с одновременной инициализацией.

Читайте также:  Как настроить переадресацию смс iphone
4. Какие преимущества и недостатки дает использование класса string в сравнении с типом char* ?

Создание нового типа string было обусловлено недостатками работы с строками символов, который демонстрировал тип char* . В сравнении с типом char* тип string имеет следующие основные преимущества:

  • возможность обработки строк стандартными операторами C++ ( = , + , = = , <> и т.п.). Как известно, при использовании типа char* даже наиболее простые операции со строками выглядели сложно и требовали написания чрезмерного программного кода;
  • обеспечение лучшей надежности (безопасности) программного кода. Например, при копировании строк, тип string обеспечивает соответствующие действия, которые могут возникнуть в случае, если строка-источник имеет больший размер чем строка-приемник;
  • обеспечение строки, как самостоятельного типа данных. Объявление типа string как строки есть единым для всех переменных в программе, которая обеспечивает непротиворечивость данных.

Основным недостатком типа string в сравнении с типом char* , есть замедленная скорость обработки данных. Это связано с тем, что тип string – это, фактически, контейнерный класс. А работа с классом требует дополнительной реализации программного кода, который, в свою очередь занимает лишнее время.

5. Какие операторы можно использовать с объектами класса string ?

Класс string есть удобен тем, что позволяет удобно манипулировать строками, используя стандартные (перегруженные) операторы.

С объектами класса string можно использовать нижеследующие операторы

  • = – присваивание
  • + – конкатенация (объединение строк)
  • += – присваивание с конкатенацией
  • == – равенство
  • != – неравенство
  • – меньше
  • – меньше или равно
  • > – больше
  • >= – больше или равно
  • [ ] – индексация

Пример, который демонстрирует использование вышеприведенных операторов

6. Содержит ли класс string конструкторы?

Как и любой класс, класс string имеет ряд конструкторов. Основные из них следующие:

7. Примеры инициализации с помощью конструкторов

Ниже приведены примеры инициализации переменных типа string

8. Присваивание строк. Функция assign() . Примеры

Чтобы присвоить одну строку другой, можно применить один из двух методов:

  • использовать оператор присваивания ‘=’ ;
  • использовать функцию assign() из класса string .

Функция assign() имеет несколько перегруженных реализаций.

Первый вариант – это вызов функции без параметров

В этом случае происходит простое присваивание одной строки другой.

Второй вариант позволяет копировать заданное количество символов из строки:

  • s – объект, из которого берется исходная строка;
  • st – индекс (позиция) в строке, из которой начинается копирование num символов;
  • num – количество символов, которые нужно скопировать из позиции st ;
  • size_type – порядковый тип данных.

Третий вариант функции assign() копирует в вызывающий объект первые num символов строки s :

  • s – строка, которая завершается символом ‘\0’ ;
  • num – количество символов, которые копируются в вызывающий объект. Копируются первые num символов из строки s .

Ниже приведен пример с разными реализациями функции assign() .

Пример.

9. Объединение строк. Функция append() . Пример

Для объединения строк используется функция append() . Для добавления строк также можно использовать операцию ‘+’ , например:

Однако, функция append() хорошо подходит, если нужно добавлять часть строки.

Функция имеет следующие варианты реализации:

В первом варианте реализации функция получает ссылку на строчный объект s , который добавляется к вызывающему объекту. Во втором варианте реализации функция получает указатель на строку типа const char * , которая завершается символом ‘\0’ .

Пример. Демонстрация работы функции append() .

10. Вставка символов в строке. Функция insert() . Пример

Чтобы вставить одну строку в заданную позицию другой строки нужно использовать функцию insert() , которая имеет несколько вариантов реализации.

Первый вариант функции позволяет вставить полностью всю строку s в заданную позицию start вызывающей строки (вызывающего объекта):

Второй вариант функции позволяет вставить часть (параметры insStart , num ) строки s в заданную позицию start вызывающей строки:

В вышеприведенных функциях:

  • s – строка, которая вставляется в вызывающую строку;
  • start – позиция в вызывающей строке, из которой осуществляется вставка строки s ;
  • insStart – позиция в строке s , из которой происходит вставка;
  • num – количество символов в строке s , которые вставляются с позиции insStart .
11. Замена символов в строке. Функция replace() . Пример

Функция replace() выполняет замену символов в вызывающей строке. Функция имеет следующие варианты реализации:

В первом варианте реализации вызывающая строка заменяется строкой s . Есть возможность задать позицию ( start ) и количество символов ( num ) в вызывающей строке, которые нужно заменить строкой s .

Второй вариант функции replace() отличается от первого тем, что позволяет заменять вызывающую строку только частью строки s . В этом случае задаются два дополнительных параметра: позиция replStart и количество символов в строке s , которые образуют подстроку, которая заменяет вызывающую строку.

Пример. Демонстрация работы функции replace() .

12. Удаление заданного количества символов из строки. Функция erase() . Пример

Для удаления символов из вызывающей строки используется функция erase() :

  • index – индекс (позиция), начиная из которой нужно удалить символы в вызывающей строке;
  • num – количество символов, которые удаляются.

Пример.

13. Поиск символа в строке. Функции find() и rfind() . Примеры

В классе string поиск строки в подстроке можно делать двумя способами, которые отличаются направлением поиска:

  • путем просмотра строки от начала до конца с помощью функции find() ;
  • путем просмотра строки от конца к началу функцией rfind() .

Прототип функции find() имеет вид:

  • s – подстрока, которая ищется в строке, что вызывает данную функцию. Функция осуществляет поиск первого вхождения строки s . Если подстрока s найдена в строке, что вызвала данную функцию, тогда возвращается позиция первого вхождения. В противном случае возвращается -1;
  • start – позиция, из которой осуществляется поиск.

Прототип функции rfind() имеет вид:

  • s – подстрока, которая ищется в вызывающей строке. Поиск подстроки в строке осуществляется от конца к началу. Если подстрока s найдена в вызывающей строке, то функция возвращает позицию первого вхождения. В противном случае функция возвращает -1;
  • npos – позиция последнего символа вызывающей строки;
  • start – позиция, из которой осуществляется поиск.

Пример 1. Фрагмент кода, который демонстрирует результат работы функции find()

Пример 2. Демонстрация работы функции rfind() .

14. Сравнение частей строк. Функция compare() . Пример

Поскольку тип string есть классом, то, чтобы сравнить две строки между собой можно использовать операцию ‘= =’ . Если две строки одинаковы, то результат сравнения будет true . В противном случае, результат сравнения будет false .

Но если нужно сравнить часть одной строки с другой, то для этого предусмотрена функция compare() .

Прототип функции compare() :

  • s – строка, которая сравнивается с вызывающей строкой;
  • start – позиция (индекс) в строке s , из которой начинается просмотр символов строки для сравнения;
  • num – количество символов в строке s , которые сравниваются с вызывающей строкой.

Функция работает следующим образом. Если вызывающая строка меньше строки s , то функция возвращает -1 (отрицательное значение). Если вызывающая строка больше строки s , функция возвращает 1 (положительное значение). Если две строки равны, функция возвращает 0.

Пример. Демонстрация работы функции compare() :

15. Получение строки с символом конца строки ‘\0’ ( char * ). Функция c_str() . Пример

Чтобы получить строку, которая заканчивается символом ‘\0’ используется функция c_str() .

Функция объявлена с модификатором const . Это означает, что функция не может изменять вызывающий объект (строку).

Пример 1. Преобразование типа string в const char * .

Пример 2.

Ниже продемонстрирован перевод строки из string в тип System::String для отображения его в элементе управления типа Label для приложений типа Windows Forms Application .

16. Как определить длину строки типа string ? Функция length()

Для определения количества символов в строке используется функция length() без параметров.

Источник

Оцените статью