Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
nwpepper
0 / 0 / 0
Регистрация: 01.08.2016
Сообщений: 7
01.08.2016, 09:48     Не могу разбить строку по разделителю #1
Суть такая: Делаю задачу копирования информации в папку на всех устройствах.
Есть строка пути в виде: Откуда|Куда;Откуда|Куда;... и.т.д.
Не могу распарсить на токены. Я путаюсь с 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. Подскажите куда копать или что я не так делаю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2016, 09:48     Не могу разбить строку по разделителю
Посмотрите здесь:

Разбить строку C++
C++ Разбить строку на слова
Разбить строку C++
C++ Разбить строку
как разбить строку C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DemolitionMan
 Аватар для DemolitionMan
22 / 54 / 18
Регистрация: 06.04.2016
Сообщений: 325
02.08.2016, 07:34     Не могу разбить строку по разделителю #21
В чем проблема переидти на char обычный(Я хочу услышать мнение автора темы)?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4260 / 3691 / 1243
Регистрация: 14.04.2014
Сообщений: 14,467
02.08.2016, 08:30     Не могу разбить строку по разделителю #22
Цитата Сообщение от nwpepper Посмотреть сообщение
После первого прохода цикла строка превращается в строку китайских иероглифов.
Ты исправил возврат?
DemolitionMan
 Аватар для DemolitionMan
22 / 54 / 18
Регистрация: 06.04.2016
Сообщений: 325
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);
nofx
7 / 7 / 1
Регистрация: 28.10.2012
Сообщений: 85
Завершенные тесты: 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();
}
nmcf
4260 / 3691 / 1243
Регистрация: 14.04.2014
Сообщений: 14,467
02.08.2016, 19:26     Не могу разбить строку по разделителю #25
nofx, у него какая-то проблема с выводом, а не с TCHAR.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2016, 17:34     Не могу разбить строку по разделителю
Еще ссылки по теме:

C++ Разбить строку на слова
Разбить строку на слова C++
Как проще всего разбить строку на ряд строк по разделителю? C++

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

Или воспользуйтесь поиском по форуму:
nofx
7 / 7 / 1
Регистрация: 28.10.2012
Сообщений: 85
Завершенные тесты: 1
12.08.2016, 17:34     Не могу разбить строку по разделителю #26
Цитата Сообщение от nmcf Посмотреть сообщение
nofx, у него какая-то проблема с выводом, а не с TCHAR.
Так он же одинэснег, у них всегда так =)
Yandex
Объявления
12.08.2016, 17:34     Не могу разбить строку по разделителю
Ответ Создать тему
Опции темы

Текущее время: 21:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru