Russian Qt Forum
Ноябрь 26, 2024, 07:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4 ... 11   Вниз
  Печать  
Автор Тема: string и startsWith  (Прочитано 61264 раз)
mutineer
Гость
« Ответ #15 : Май 20, 2013, 11:11 »

Ну ладно, нашли "h(H)", а нужно-то было "hello"

Кому нужно? Топикстартеру нужно было startsWith
« Последнее редактирование: Май 20, 2013, 11:30 от mutineer » Записан
mutineer
Гость
« Ответ #16 : Май 20, 2013, 11:13 »

ясно, спс.
но, имхо, для функций, которые возвращают не только 0 или 1
такая запись некорректна
if (!word.find_first_of("hH")) { // wtf? }

я бы так писал
if (word.find_first_of("hH") == 0) { // строка начинается с символа из группы }
if (word.find_first_of("hH") != -1) { // строка содержит символ из группы }

Если интересно вернула функция 0 или не 0 эта запись вполне корректна. В этом случае интерес как раз в том равен результат 0 или не равен. -1 там или какое другое значения непринципиально
Записан
thechicho
Гость
« Ответ #17 : Май 20, 2013, 11:23 »

я не говорю, что запись неверна.
я говорю некорректна.

if (!word.find_first_of("hH"))
если в строке не найдено первым "hH". я так прочитал сначала и подумал wtf?
когда прочитал справку по методу find_first_of(), то дошло, что имелось в виду, если метод вернет 0. значит строка начинается с "hH"

if (word.find_first_of("hH") == 0)
тут мне сразу понятно, что метод возвращает позицию первого вхождения. и если эта позиция 0, то значит строка начинается с "hH"

ну это все субъективно. я такое использование не встречал, поэтому сразу не сообразил.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #18 : Май 20, 2013, 11:28 »

Ну ладно, нашли "h(H)", а нужно-то было "hello"

Да ладно  Непонимающий
А по-моему, ТС ясно написал, что нужно..

Ну если уж Вам так хочется искать именно "hello":
Код
C++ (Qt)
std::string word = "hello";
if (!word.find("hello")) {
   ...
}
 

ясно, спс.
но, имхо, для функций, которые возвращают не только 0 или 1
такая запись некорректна
if (!word.find_first_of("hH")) { // wtf? }
Эт почему это некорректна  Непонимающий
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Май 20, 2013, 12:06 »

Код
C++ (Qt)
std::string word = "hello";
if (!word.find("hello")) {
   ...
}
 
А так нет регистра Улыбающийся Помню как-то в очередной текстовой разборке решил поиспользовать std::string, ну и пришлось клепать утилиты (startsWith, trim и.т.п.), ничего готового не нашел

Код
C++ (Qt)
Эт почему это некорректна
Да она может и корректна, но заставляет читающего без нужды ломать голову - и это плохо
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #20 : Май 20, 2013, 12:23 »

А так нет регистра Улыбающийся Помню как-то в очередной текстовой разборке решил поиспользовать std::string, ну и пришлось клепать утилиты (startsWith, trim и.т.п.), ничего готового не нашел
Ну не в boost'е же смотреть. Право слово. Улыбающийся
http://www.boost.org/doc/libs/1_53_0/doc/html/string_algo/quickref.html#idp163449456

Да она может и корректна, но заставляет читающего без нужды ломать голову - и это плохо
Без нужды ломать голову... это плохо... у нас все время надо ломать голову и чем больше ломаешь, тем лучше. Подмигивающий
Записан
Spark
Гость
« Ответ #21 : Май 20, 2013, 15:06 »

Лучше всё-таки, потратить несколько вечеров на эксперименты, изучая плюсЫ)
Материал я постепенно изучаю. Но вот такая ситуация, что разбираю код и подгоняю программу под себя. И до поры до времени хватало логики, что бы делать это без знаний C++  и QT Улыбающийся. Настроил Qt, взял исходник и, небольшой навык в программировании и логике и этого хватало, что бы переставлять кирпичики и перестраивать программу. Но вот уперся в предел возможностей для такого подхода блочной перестановки. И хоть получается с точки зрения пользователя все красиво. Но вот изнутри халтурно. Взялся за справочную информацию и последовательно слушаю видео лекции. Но вот код подправить надо сиюминутно и обидно, что чувствую что решение близко, но не хватает понимания, что делаю. Метод проб и ошибок долог в данной ситуации. Пока осознаю весь материал, а уж когда дойду до подробностей... А тут показали строчку и все заработало. Это дало гораздо больше, чем попытка осознать справочную информацию, где может и есть то, что мне нужно, но к сожалению требует слишком много дополнительной информации, прежде чем я смогу осознать, что же там написано. Чуточку, но логика для меня постепенно выстраивается в связную форму Улыбающийся. Нельзя сказать, что я все понял. Но картина целостности из таких кирпичиков выстраивается довольно быстро, если практиковаться.
Опыт профи бесценен. Спасибо за советы. Полагаю, что вопросов будет еще не мало. Надеюсь, что добрые люди, желающие и не ленящиеся помочь всегда будут, даже если вопросы заданы в сотый раз. Не всегда просто найти с ходу именно нужную информацию. Прежде чем спросить, пару вечеров потратил найти краткий и ясный ответ, параллельно экспериментируя, ориентируясь на справочник.
« Последнее редактирование: Май 20, 2013, 15:16 от Spark » Записан
Spark
Гость
« Ответ #22 : Май 21, 2013, 04:27 »

На всякий случай поясню ситуацию. Может интересно. Извините, что наверное корявым языком. Но я только учусь.
На самом деде, конечно упростил пример, что бы получить ясный ответ.

Если бы у меня была простая строка, то сложностей не возникало. Я просто писал так:
Код:
QString str("hello");
if ( str.startsWith("h") )
И все работало.

В реальности же:
string word = некой переменной, которую пользователь вносит сам и которая участвует в длинной цепочке ifов. И различных startsWith хватает, так же как и endsWith. И не только по одному символу, но и цепочки.

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

В реальности же кусочек кода сейчас выглядит примерно так:
Код:
string nam = Utf8::encode( node.Attr );
QString str = nam.c_str();
if ( str.startsWith( "#" ) )
И все отлично работает. Символ может быть не один, а последовательность символов.

А вообще startsWith и endsWith для меня как палочка выручалочка.

Вот вроде устаревшие варианты left()  и right(). Если не сложно поясните как бы этот код с этими функциями выглядел?
« Последнее редактирование: Май 21, 2013, 04:31 от Spark » Записан
mutineer
Гость
« Ответ #23 : Май 21, 2013, 10:14 »

Почему left() и right() устаревшие и как они вообще связаны с startsWith() ?
Записан
Spark
Гость
« Ответ #24 : Май 21, 2013, 10:40 »

Почему left() и right() устаревшие и как они вообще связаны с startsWith() ?
Наверное это все относительно. Относительно startsWith более старые.
Код:
if ( str.left(1) == "h" )
Записан
mutineer
Гость
« Ответ #25 : Май 21, 2013, 10:45 »

Можно их и так использовать, да. Можно и под кроватью спать. Но основное их предназначение все-таки не заменять startsWith, а получать кусок строки
Записан
Spark
Гость
« Ответ #26 : Май 21, 2013, 10:49 »

Можно их и так использовать, да. Можно и под кроватью спать. Но основное их предназначение все-таки не заменять startsWith, а получать кусок строки
Мои поступки нельзя строго судить Улыбающийся. Я ведь только учусь. К тому же не я это выдумал, в процессе поиска нашел в справочном материале. С другой стороны, если это работало, то почему сразу - не стоит?
Впрочем вывод.  Если альтернатив для startsWith не было, значит устарело, по крайней мере для такого применения.
« Последнее редактирование: Май 21, 2013, 10:55 от Spark » Записан
mutineer
Гость
« Ответ #27 : Май 21, 2013, 10:58 »

Потому что left создает целый новый объект QString, который тут же и уничтожается. Если чем-то не нравится startsWith, то уж лучше заменить его хотя бы на at()
Записан
SimpleSunny
Гость
« Ответ #28 : Май 21, 2013, 12:18 »

Код
C++ (Qt)
QString str = word.c_str();

А при наличии '\0' в середине строки сколько времени потратим на отладку?

QString   fromStdString ( const std::string & str )
QString   fromStdWString ( const std::wstring & str )
Записан
Spark
Гость
« Ответ #29 : Май 26, 2013, 04:19 »

Ребят подскажите еще такой момент.
Тот же участок кода:
Код:
string nam = Utf8::encode( node.Attr );
QString str = nam.c_str();
if ( str.startsWith( "#" ) )
{
result += "контент " + nam;
}

- допустим переменная nam = " происходит от лат. слова или гр. слова "
Прежде чем выдать переменную nam, как лат. заменить на латинского и гр. на греческого. Учитывая, что сокращений может быть несколько разных в переменной, но сокращения заранее известны. Что в самой переменной мне не известно. Ее вводит пользователь. Но известно какие могут встречаться сокращения.
- И второй вариант. Опять же, как прежде чем выдать nam убрать из нее последний символ.

Очень бы хотелось, что бы решения были, так же, как можно проще и доступным языком.
Буду благодарен.
« Последнее редактирование: Май 26, 2013, 04:27 от Spark » Записан
Страниц: 1 [2] 3 4 ... 11   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.225 секунд. Запросов: 23.