Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2011, 22:46   #1
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию С++|Поиск фрагмента строки

Добрый вечер! Вот тут попробовал написать программку, для поиска фрагмента строки, при компиляции ошибки не показывает, а при выполнении говорит что:"invalid string position". Не пойму где именно ошибся, вроде всё верно. Вот код:
Код:
#include <iostream>
#include <clocale>
#include <string>
void main(){
std::setlocale(LC_ALL,"Russian_Russia");
	int size_str_2, find_point;
	std::string str_2;
	std::string str("Казнить нельзя помиловать");
		str.insert(14,",");
		std::cout<<str[6]<<std::endl;
		std::cout<<str.at(4)<<std::endl;
		std::cout.width(40);
                std::cout<<str<<std::endl;
		std::cout<<str.size()<<std::endl;
		std::cout<<"Введите слово для поиска:"<<std::endl;
		std::cin>>str_2;
		size_str_2=str_2.size();
		find_point=str.find(str_2);
		for(int i=find_point;i<size_str_2;i++)
			std::cout<<str.at(i);		
 std::cin.get();
}
Может дело в том, что я сделал так:
Код:
std::cout<<"Введите слово для поиска:"<<std::endl;
std::cin>>str_2;
И вот тут:
Код:
find_point=str.find(str_2);
он уже ищет не(допустим): нельзя
а: нельзя\0
Ну вы меня поняли(надеюсь)). И если я прав, то как этого избежать?
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 13.07.2011, 22:58   #2
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

И ещё, в строку str_2, вместо кириллических символов, помещается абракадабра, хотя локаль вроде бы подключена, что нужно сделать что бы всё было нормально?
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 14.07.2011, 00:37   #3
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

После пошагового прогона программы, стало понятно, что ошибка выскакивает в этом фрагменте:
Код:
find_point=str.find(str_2);
		for(int i=find_point;i<size_str_2;i++)
			std::cout<<str.at(i);
У кого нибудь есть какие нибудь мысли по этому поводу?
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 14.07.2011, 00:57   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

устанавливай
1: Use Unicode Character Set

2: setlocale(LC_ALL,"Russian_Russia.86 6");

3: вместо string,cin,cout используй wstring, wcin, wcout

Последний раз редактировалось EUGY; 14.07.2011 в 00:59.
EUGY вне форума Ответить с цитированием
Старый 14.07.2011, 01:09   #5
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
устанавливай
1: Use Unicode Character Set

2: setlocale(LC_ALL,"Russian_Russia.86 6");

3: вместо string,cin,cout используй wstring, wcin, wcout
Попробовал как вы сказали, стало ещё веселее:
1.Текст стал невидимым.
2.Ошибка осталась((
Мне кажется, что всё таки я что-то не правильно делаю с функцией find().
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 14.07.2011, 01:10   #6
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Вот текст ошибки:
Необработанное исключение в "0x7675b727" в "struct.exe": Исключение Microsoft C++: std:ut_of_range по адресу 0x003df5e4..
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 14.07.2011, 01:22   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

у тебя str.find возвращает -1 из-за несоответствия кодировок.
Код:
#include <iostream>
#include <clocale>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
	setlocale(LC_ALL,"Russian_Russia.866");
	int size_str_2, find_point;
	wstring str_2;
	wstring strx(L"Казнить нельзя помиловать");
		strx.insert(14,L",");
		wcout<<strx[6]<<endl;
		wcout<<strx.at(4)<<endl;
		wcout.width(40);
        wcout<< strx << endl;
		wcout<<strx.size()<<endl;
		wcout<< L"Введите слово для поиска:" <<endl;
		wcin>>str_2;
		size_str_2=str_2.size();
		find_point=strx.find(str_2);
		if (find_point>=0)
			for(int i=find_point;i<size_str_2;i++)
				wcout<<strx.at(i);		
		wcin.get();
	return 0;
}
EUGY вне форума Ответить с цитированием
Старый 14.07.2011, 01:59   #8
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Большое спасибо, программа теперь работает. Но вы не знаете, почему она корректно находит только слово "Казнить"? И ещё функция wcin.get() теперь не работает? Ответьте пожалуйста, если вас не затруднит.
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 14.07.2011, 02:45   #9
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Я когда постил "исправленный" вариант, не анализировал написанный тобой код, а просто формально подошел к этому делу, т.к не понимаю, что ты хочешь вывести.
К чему этот цикл?
Код:
for(int i=find_point;i<size_str_2;i++)
    wcout<<strx.at(i);
Почему в size_str_2 длина строки str_2, а не strx?

Последний раз редактировалось EUGY; 14.07.2011 в 02:49.
EUGY вне форума Ответить с цитированием
Старый 14.07.2011, 03:04   #10
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Этот цикл выводит найденное слово.
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск фрагмента изображения на картинке banderas.antonio C# (си шарп) 3 07.05.2011 18:45
Замена фрагмента строки (Pascal) Volk_xD Помощь студентам 2 17.12.2010 18:08
Поиск фрагмента по Lixtbox'у. Pavarotti Общие вопросы Delphi 15 09.08.2010 12:25
Удаление фрагмента текста Шурик Общие вопросы Delphi 0 31.05.2009 16:11
Поиск и выделение фрагмента в вордовском документе Bobby Общие вопросы Delphi 1 17.04.2009 17:07