Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
nwpepper
0 / 0 / 0
Регистрация: 01.08.2016
Сообщений: 7
#1

Не могу разбить строку по разделителю - C++

01.08.2016, 09:48. Просмотров 782. Ответов 25
Метки нет (Все метки)

Суть такая: Делаю задачу копирования информации в папку на всех устройствах.
Есть строка пути в виде: Откуда|Куда;Откуда|Куда;... и.т.д.
Не могу распарсить на токены. Я путаюсь с char, wchar, TCHAR, WCHAR, и прочими. Приходится делать много преобразований.
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
WCHAR* strForCopyFiles = getstrForCopyFiles(L"D:\\ANT\\Act_2016_07.rar", massID);   
 
    // 2. Разбираем строку и копируем файлы на устройства
    wchar_t * context = NULL;
    wchar_t * token = NULL; 
    token = wcstok_s(strForCopyFiles, L";", &context);
 
    // Всё норм, в консоль ерунду выводит
    while (token != NULL) {
            wprintf_s(L"%s\n", token);
            token = wcstok_s(NULL, L";", &context);
    }
Строка полученная: "D:\\ANT\\Act_2016_07.rar|F:\\Test; D:\\ANT\\Act_2016_07.rar|E:\\Test;"
Нужно распарсить и скопировать одно и то же значение в обе папки Test.
Проблема в том, что wprinf не выводит в консоль пути какие нужно. Все примеры сделаны в интернете с cstok_s, но у меня тип строки Unicode. Подскажите куда копать или что я не так делаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2016, 09:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу разбить строку по разделителю (C++):

Разбить строку по заданному разделителю - C++
Код ниже может разбить строку по разделителю, который заранее указан в char const. Можно ли сделать как - то так, чтобы разделитель выбирал...

Как проще всего разбить строку на ряд строк по разделителю? - C++
Пусть например есть строка "abc;dasfadfa;asfadsfv". Надо разбить ее соответственно на 3 строки по разделителю ";". Как это проще всего...

Разбить строку - C++
Есть строка: Нужно написать функцию, чтобы в результате получилось на выходе например в vector<string> Вот что смог...

Разбить строку - C++
Просьба написать программу на С++ , которая разбивает строку длинной в 200 символов на строки по 20.

Разбить строку - C++
У меня есть строка string^ str в неё записано 6 символов. Как мне разбить эту строку на еще три строки в каждой из которых будут по два...

Как разбить строку - C++
Как прочитать такую строку за один раз? Ukraine Kiev Donetsk Odessa и как мне строку разбить на слова и добавить в вектор. ...

25
DemolitionMan
98 / 154 / 47
Регистрация: 06.04.2016
Сообщений: 992
01.08.2016, 17:38 #16
Хотел еще автору регулярные выражения посоветовать, там все влегкую делается. Остается дело за малым - изучить это.

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
А можно использовать родной для winapi unicode,
и не парить голову ни себе, ни людям.
- а я думал программирование это и есть головопарка. То что Вы говорите это только Microsoft Visual Studio 2013/2015 или какая там версия у автора? А в Билдере есть такое?
0
hoggy
6702 / 2884 / 494
Регистрация: 15.11.2014
Сообщений: 6,482
Завершенные тесты: 1
01.08.2016, 17:41 #17
Цитата Сообщение от DemolitionMan Посмотреть сообщение
То что Вы говорите это только Microsoft Visual Studio 2013/2015 или какая там версия у автора?
это - windows.
0
nofx
7 / 7 / 1
Регистрация: 28.10.2012
Сообщений: 113
Завершенные тесты: 1
01.08.2016, 17:46 #18
А massID почему в многобайтной кодировке? Может стоит переписать, чтобы не юзать s2ws?
Выложите Ваш проект.
Также мучался c этипими типами, пришел к выводу что лучше использовать TCHAR и LPTSTR (и дописывать "TEXT" вместо "L")
1
nwpepper
0 / 0 / 0
Регистрация: 01.08.2016
Сообщений: 7
02.08.2016, 04:54  [ТС] #19
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Хотел еще автору регулярные выражения посоветовать, там все влегкую делается. Остается дело за малым - изучить это.
Что такое регулярные выражения я в курсе,спасибо :-)
Но я программирую на 1С в целом. На с++ нужно написать внешнюю компоненту. Уровень знаний - лабы в школе.
Поэтому классов, к-е работают с рег. выражениями в с++ я не знаю стандартных. А сторонние библиотеки подключать во внешнюю dll - не хочется. Задача то простая.

Добавлено через 1 минуту
Цитата Сообщение от nofx Посмотреть сообщение
Выложите Ваш проект.
А подскажите как выложить весь проект? Я с удовольствием поделюсь.

Добавлено через 2 минуты
Цитата Сообщение от nofx Посмотреть сообщение
пришел к выводу что лучше использовать TCHAR и LPTSTR (и дописывать "TEXT" вместо "L")
Вот я также пришел к этому выводу. На практике не могу понять как сделать, потому что одни функции требуют TCHAR, другие - обычный char.

Добавлено через 1 минуту
Цитата Сообщение от DemolitionMan Посмотреть сообщение
UTF-8, автор ведь по-китайски не говорит, верно?
К сожалению, не говорю))
0
nwpepper
0 / 0 / 0
Регистрация: 01.08.2016
Сообщений: 7
02.08.2016, 06:50  [ТС] #20
После первого прохода цикла строка превращается в строку китайских иероглифов.
0
Миниатюры
Не могу разбить строку по разделителю  
DemolitionMan
98 / 154 / 47
Регистрация: 06.04.2016
Сообщений: 992
02.08.2016, 07:34 #21
В чем проблема переидти на char обычный(Я хочу услышать мнение автора темы)?
0
nmcf
5551 / 4861 / 1648
Регистрация: 14.04.2014
Сообщений: 19,745
02.08.2016, 08:30 #22
Цитата Сообщение от nwpepper Посмотреть сообщение
После первого прохода цикла строка превращается в строку китайских иероглифов.
Ты исправил возврат?
0
DemolitionMan
98 / 154 / 47
Регистрация: 06.04.2016
Сообщений: 992
02.08.2016, 10:00 #23
Исправил char на wchar_t, но Microsoft Visual Studio 2013/2015 по-любому нету, т.е. здесь C++Builder6.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//---------------------------------------------------------------------------
#include <vcl.h>
#include <conio.h>
#include <stdio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
wchar_t *w, *Ow, *sw1, *sw2, *sw3, *sw4;;
 
printf("sizeof(w)=%i\n", sizeof(w));
w = UTF8Decode("D:\\ANT\\Act_2016_07.rar|F:\\Test; D:\\ANT\\Act_2016_07.rar|E:\\Test;");
printf("Stroka=%s\n", w);
printf("sizeof(w)=%i\n", sizeof(w));
 
//--1--
//char *strtok(char *s1, const char *s2);
sw1 = wcstok(w, UTF8Decode("|"));
printf("sw1=%ls\n", sw1);
//Áåðåì îñòГ*òîê.
Ow = wcstok(NULL, UTF8Decode(","));
if(Ow) printf("Ow=%ls\n", Ow);
 
//--2--
sw2 = wcstok(Ow, UTF8Decode(";"));
printf("sw2=%ls\n", sw2);
//Áåðåì îñòГ*òîê.
Ow = wcstok(NULL, UTF8Decode(","));
if(Ow) printf("Ow=%ls\n", Ow);
 
//--3--
Ow++;
sw3 = wcstok(Ow, UTF8Decode("|"));
printf("sw3=%ls\n", sw3);
//Áåðåì îñòГ*òîê.
Ow = wcstok(NULL, UTF8Decode(","));
if(Ow) printf("Ow=%ls\n", Ow);
 
//--4--
sw4 = wcstok(Ow, UTF8Decode(";"));
printf("sw4=%ls\n", sw4);
0
nofx
7 / 7 / 1
Регистрация: 28.10.2012
Сообщений: 113
Завершенные тесты: 1
02.08.2016, 18:59 #24
Цитата Сообщение от nwpepper Посмотреть сообщение
А подскажите как выложить весь проект? Я с удовольствием поделюсь.
Нужно перейти к папке на диске, в которой сохранены Ваши файлы. Чтобы быстро перейти к этой папке нужно через "Обозреватель решений" (ага, есть такой в VS, можно погуглить) а там клацнуть правой кнопкой мышки по файлу проекта (!), далее в контекстном меню пункт "Открыть папку в проводнике"

А вообще, у Вас проблема может быть связана с настройкой проекта - возможно, нужно перевести свойство "Набор символов" в использовать Unicode

Добавлено через 1 час 9 минут
Жи есть! Как-то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <Windows.h>
#include <stdio.h>
//#include <tchar.h> - Гуру не рекомендуют вместе с <Windows.h> ! 
#include <vector>
#include <conio.h>
using namespace std;
 
TCHAR* getstrForCopyFiles(TCHAR* myStr, std::vector<TCHAR*> &massID)
{
    static TCHAR strForCopyFiles[MAX_PATH] = L"";  // а зачем прибавляли + 1 ?
 
    for (vector<TCHAR*>::iterator it = massID.begin(); it != massID.end(); it++)
    {
        //std::wstring stemp = s2ws(*it);
        LPCWSTR result = (LPCWSTR)*it;
        lstrcat(strForCopyFiles, result);
        lstrcat(strForCopyFiles, L"|");
        lstrcat(strForCopyFiles, myStr);
        lstrcat(strForCopyFiles, L";");
    }
 
    return strForCopyFiles;
}
 
 
int main()
{
    TCHAR* id_1 = L"Test";
    vector<TCHAR*> massID;
    massID.push_back(id_1);
 
    TCHAR* strForCopyFiles = getstrForCopyFiles(TEXT("D:\\ANT\\Act_2016_07.rar"), massID);
 
    // 2. Разбираем строку и копируем файлы на устройства
    wchar_t * context = NULL;
    wchar_t * token = NULL;
    token = wcstok_s(strForCopyFiles, L";", &context);
 
    // Всё норм, в консоль ерунду выводит
    while (token != NULL) {
        wprintf_s(L"%s\n", token);
        token = wcstok_s(NULL, L";", &context);
    }
 
    _getwch();
}
Добавлено через 18 минут
Поспешил. А вот реализация, которая будет работать как и с включенным юникодом, так и с обычными строками.
Там видно, засчет чего это делается.
П.С вот по теме ссыль, которую нужно какбе вкурить https://habrahabr.ru/post/164193/
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <Windows.h>
#include <stdio.h>
//#include <tchar.h> - Гуру не рекомендуют вместе с <Windows.h> ! 
#include <vector>
#include <conio.h>
using namespace std;
 
TCHAR* getstrForCopyFiles(TCHAR* myStr, std::vector<TCHAR*> &massID)
{
    static TCHAR strForCopyFiles[MAX_PATH] = TEXT("");  // а зачем прибавляли + 1 ?
 
    for (vector<TCHAR*>::iterator it = massID.begin(); it != massID.end(); it++)
    {
        //std::wstring stemp = s2ws(*it);
        LPCTSTR result = (LPCTSTR)*it;
        lstrcat(strForCopyFiles, result);
        lstrcat(strForCopyFiles, TEXT("|"));
        lstrcat(strForCopyFiles, myStr);
        lstrcat(strForCopyFiles, TEXT(";"));
    }
 
    return strForCopyFiles;
}
 
 
int main()
{
    TCHAR* id_1 = TEXT("Test");
    vector<TCHAR*> massID;
    massID.push_back(id_1);
 
    TCHAR* strForCopyFiles = getstrForCopyFiles(TEXT("D:\\ANT\\Act_2016_07.rar"), massID);
 
    // 2. Разбираем строку и копируем файлы на устройства
    TCHAR * context = NULL;
    TCHAR * token = NULL;
    
    token = strtok_s(strForCopyFiles, TEXT(";"), &context);
    
    // Всё норм, в консоль ерунду выводит
    while (token != NULL) {
        printf_s(TEXT("%s\n"), token);
        token = strtok_s(NULL, TEXT(";"), &context);
    }
 
    _getwch();
}
0
nmcf
5551 / 4861 / 1648
Регистрация: 14.04.2014
Сообщений: 19,745
02.08.2016, 19:26 #25
nofx, у него какая-то проблема с выводом, а не с TCHAR.
0
nofx
7 / 7 / 1
Регистрация: 28.10.2012
Сообщений: 113
Завершенные тесты: 1
12.08.2016, 17:34 #26
Цитата Сообщение от nmcf Посмотреть сообщение
nofx, у него какая-то проблема с выводом, а не с TCHAR.
Так он же одинэснег, у них всегда так =)
0
12.08.2016, 17:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2016, 17:34
Привет! Вот еще темы с ответами:

Разбить строку на слова - C++
Здравствуйте! Решаю задачу, надо разбить предложение на слова с помощью функции strtok. Делаю вот так но не уверен что это правильно....

разбить строку в массив - C++
Как разбить массив символов в отдельный массив по слову?Я вот что-то написал,проде бы правильно,но когда например ввожу строку &quot;heavy...

Разбить строку на слова - C++
Разбить строку на слова. Все слова записать в отдельную строку. Помогите пожалуйста не получается. #include &lt;iostream&gt; #include...

Как разбить строку - C++
Здравствуйте! Как извлечь из вводимой строки только символы? К примеру, вводим &quot; asd sss 12&quot;, а на выходе получаем asd, sss и 12?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru