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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2017, 01:21   #1
swswsss
 
Регистрация: 13.12.2017
Сообщений: 3
По умолчанию помогите разобраться с substr

написал вот такую программу.по моему замыслу она должна записывать в вектор емейлы без повторов
вот код
Код:
// ConsoleApplication41.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

int main()
{
	string str = "a1@ya.ru,a1@ya.ru";
	string str1 = "";

	vector<string> s = {};
	int q = 0;

	for (int i = 0; i<(int)str.size(); i++)
	{
		if (str[i] == ',')
		{

			string str2 = str.substr(q, i);

			cout << str2 << endl;
			//auto it = std::find(s.begin(), s.end(), str2);
			auto it = find(s.begin(), s.end(), str2);
			if (it != s.end())
			{
				cout << "POVTOR" << endl;
			}
			else
			{
				cout << "DOBAVLEN" << endl;
				s.push_back(str2);
				q = i;
			}
			

		}

	}
	for (int i = 0; i<(int)s.size(); i++)
	{
		cout << s[i];
	}
}
если строка вот такая string str = "a1@ya.ru,a1@ya.ru"; то все ок в вектор записывается только 1 емейл. но если допустим string str = "a1@ya.ru,a1@ya.ru,a1@ya.ru"; то substr работает криво, и соответственно find не работает как нужно,подскажите как поправить
swswsss вне форума Ответить с цитированием
Старый 13.12.2017, 08:51   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

1. Вы неправильно вызываете str.substr, надо str.substr(q, i-q-1)
2. Вы неверный индекс сохраняете не q = i; а q = i+1;
3. Не надо приводит сайз к инту, используете правильные типы
4. Вместо
Код:
	for (int i = 0; i<(int)s.size(); i++)
	{
		cout << s[i];
	}
используйте for range
p51x вне форума Ответить с цитированием
Старый 13.12.2017, 12:27   #3
swswsss
 
Регистрация: 13.12.2017
Сообщений: 3
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
1. Вы неправильно вызываете str.substr, надо str.substr(q, i-q-1)
2. Вы неверный индекс сохраняете не q = i; а q = i+1;
3. Не надо приводит сайз к инту, используете правильные типы
4. Вместо
Код:
	for (int i = 0; i<(int)s.size(); i++)
	{
		cout << s[i];
	}
используйте for range
спасибо если "Не надо приводит сайз к инту, используете правильные типы" то компилятор выдает ворнинг,я понимаю что это не критично,но все же
swswsss вне форума Ответить с цитированием
Старый 13.12.2017, 12:28   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вы вместо int i в объявлении цикла напишите правильный тип и варнингов не будет, а так варнинги дело говорят (о граблях).
p51x вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
простая функция substr для UTF-8 polin11 Общие вопросы C/C++ 1 22.10.2017 14:08
Функция substr - косяк spirit-ua PHP 3 01.06.2016 17:22
Помогите с разобраться Дамир193 PHP 35 10.12.2015 13:52
помогите разобраться с C# P'er Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 12.09.2009 15:33