русский
Germany.ruForen → Архив Досок→ Programmierung

нужен совет в имплементировании

205  
krys посетитель03.06.06 14:48
NEW 03.06.06 14:48 
Привет.
Я пишу программу в Висуал Ц++
У меня есть Стринг "слово1;слово;слово3" и индех может принимать значение 0 или 1. И в зависимости от
значения
я должен получить слово1 или слово2
Поскольку я склонен к усложнениям прошу совета как можно это сделать
наиболее оптимально
мне пришло в голову следующее
CString str="слово1;слово;слово3";
CString strWord;
lIndex=1;
long lPosition=0;
for(long i=0;i<=lIndex;i++)
{
lPosition=str.Find(_T(";"),i);
strWord=str.Left(lPosition);
str=str.Mid(lPosition+1,str.GetLength());
}
стойте там и слушайте сюда, именно отсюда будет проистекать
#1 
Murr коренной житель03.06.06 16:45
Murr
03.06.06 16:45 
in Antwort krys 03.06.06 14:48
Какой именно из Висуал С++ в 7-м и 8-м у стринга есть сплит() вовращающий аррэй из субстрок.
по коду - lIndex - без типа, и что у тебя будет при пустой строке?
#2 
voxel3d коренной житель03.06.06 16:50
voxel3d
NEW 03.06.06 16:50 
in Antwort krys 03.06.06 14:48, Zuletzt geändert 03.06.06 16:56 (voxel3d)
1. Пиши на С++ а не на С.
2. Изучи stl и забудь про CString.
В ответ на:
#include <iterator>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
void tokenize(const string& str, vector<string>& tokens, const string& delimiters = " ")
{
string::size_type lastPos = str.find_first_not_of(delimiters, 0);
string::size_type pos = str.find_first_of(delimiters, lastPos);
while( string::npos!=pos || string::npos!=lastPos )
{
tokens.push_back(str.substr(lastPos, pos - lastPos));
lastPos = str.find_first_not_of(delimiters, pos);
pos = str.find_first_of(delimiters, lastPos);
}
}
int main(int argc, char** argv)
{
vector<string> tokens;
string str("Word1;Word2;Word3");
tokenize(str, tokens, ";");
copy(tokens.begin(), tokens.end(), ostream_iterator<string>(cout, ", "));
return 0;
}


Как в векторе получить элемент по индексу сам найдёшь?
Dropbox - средство синхронизации и бэкапа файлов.
#3 
krys посетитель03.06.06 17:06
NEW 03.06.06 17:06 
in Antwort Murr 03.06.06 16:45
Visual C++ 6
long lIndex
Если Стринг пустой Find(...) возрасчает -1
в итоге
получаю пустой стринг strWord
стойте там и слушайте сюда, именно отсюда будет проистекать
#4 
krys посетитель03.06.06 17:30
NEW 03.06.06 17:30 
in Antwort voxel3d 03.06.06 16:50
ну а как выход из ситуации на данный момемт это приемлемо?
стойте там и слушайте сюда, именно отсюда будет проистекать
#5 
voxel3d коренной житель03.06.06 17:59
voxel3d
NEW 03.06.06 17:59 
in Antwort krys 03.06.06 17:30
> ну а как выход из ситуации на данный момемт это приемлемо?
Думаю, нет, если ты совсем не понял, что я написал. А написал я тебе функцию, которая разбивает строку на токены используя разделители и пример, как ею пользоваться. Ты спрашивал как оптимально сделать?
Dropbox - средство синхронизации и бэкапа файлов.
#6 
Simple Nothing is f*cked03.06.06 21:23
Simple
NEW 03.06.06 21:23 
in Antwort voxel3d 03.06.06 16:50
> 2. Изучи stl и забудь про CString.
Зачем? В MFC-проекте мне лично удобнее пользоваться CString. Твой код можно так же без проблем реализовать с CString и CStringArray.
#7 
  scorpi_ скептик03.06.06 22:13
NEW 03.06.06 22:13 
in Antwort voxel3d 03.06.06 16:50
Дустом его, дустом! Пардон, бустом... shuffle
В ответ на:
#include <string>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <boost/tokenizer.hpp>
using namespace std;
using namespace boost;
int main()
{
string s( "token1;token2;token3" );
tokenizer< char_separator<char> > tok( s, char_separator<char>(";") );
copy( tok.begin(), tok.end(), ostream_iterator< string >( cout, "\n" ) );
}


#8 
  scorpi_ скептик04.06.06 10:18
NEW 04.06.06 10:18 
in Antwort Murr 03.06.06 16:45
В ответ на:
Какой именно из Висуал С++ в 7-м и 8-м у стринга есть сплит() вовращающий аррэй из субстрок.

Ладно врать-то, нет у CString такой функции.
#9 
  scorpi_ скептик04.06.06 10:20
NEW 04.06.06 10:20 
in Antwort Simple 03.06.06 21:23
Фишка в общем-то в том, что ничего писать и не надо, всё уже есть, как ты видел это одна строчка работающая на любой платформе.
#10 
Simple Nothing is f*cked04.06.06 10:50
Simple
NEW 04.06.06 10:50 
in Antwort scorpi_ 04.06.06 10:20, Zuletzt geändert 04.06.06 10:55 (Simple)
Это же внешняя библиотека? Таких можно и для MFC найти море. А о других платформах в данном случае ваще можно не говорить :)
зы Посмотрел, boost уже в стандарт предложили. Беру свои слова назад :)
#11 
Simple Nothing is f*cked04.06.06 10:51
Simple
NEW 04.06.06 10:51 
in Antwort scorpi_ 04.06.06 10:18
Он наверно опять c++ c с# перепутал :-D
#12 
Murr коренной житель04.06.06 11:34
Murr
NEW 04.06.06 11:34 
in Antwort scorpi_ 04.06.06 10:18
Читай внимательнее - string, а не CString...
#13 
Murr коренной житель04.06.06 11:36
Murr
NEW 04.06.06 11:36 
in Antwort Simple 04.06.06 10:51
А там - без разницы... если, кончно, не делать что-то VC++6.0 совместимое...
#14 
Simple Nothing is f*cked04.06.06 11:40
Simple
NEW 04.06.06 11:40 
in Antwort Murr 04.06.06 11:36
Человек и пишет в VS 6.0
#15 
Murr коренной житель04.06.06 11:56
Murr
NEW 04.06.06 11:56 
in Antwort Simple 04.06.06 11:40
Перечитай мой пост - там указано 7.0, 8.0...
#16 
Simple Nothing is f*cked04.06.06 14:02
Simple
NEW 04.06.06 14:02 
in Antwort Murr 04.06.06 11:56
А толку-то? ;) И что значит без разницы, если не используется .NET? :-P
#17