Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.117.227.194] |
|
Сообщ.
#1
,
|
|
|
Есть строка в буфере обмена скопированная с Excel, которая представляет собой таблицу с разделителями строки (\r\n) ячейки (\t).
Нужно эту строку преобразовать в массив. Максимальные возможные размеры 50 столбцов x 500 строк. int i, j, m, n; char strclipboardpaste[6400000]; // <- строка из буфера обмена char strclipboardpastematrix[50][500][256]; char strclipboardpastevector[500][12800]; char *stri; char *strj; char delimiteri[] = "\t"; char delimiterj[] = "\r\n"; m = 0; for (j=0; j<500; j++) { strj = strtok (strclipboardpaste, delimiterj); if (strj == NULL) break; strcpy(strclipboardpastevector[j], strj); m++; } for (j=0; j<m; j++) { n = 0; for (i=0; i<50; i++) { stri = strtok (strclipboardpastevector[j], delimiteri); if (stri == NULL) break; strcpy(strclipboardpastematrix[i][j], stri); n++; } } Почему этот код не работает ? |
Сообщ.
#2
,
|
|
|
я бы просто решил проблему "вручную". Надо написать процедуру, которая будет разбирать строку. Искать разделитель "\t" и куски между разделителями копировать в результирующий массив. Если размер куска равен 0, значит копируем 0 байт в массив-результат. Ничего сложного, гимнастика ума. --- Меня терзают смутные сомнения.. char strclipboardpaste[6400000]; // <- строка из буфера обмена char strclipboardpastematrix[50][500][256]; char strclipboardpastevector[500][12800]; Это где создаётся ? В стеке ? |
Сообщ.
#3
,
|
|
|
Цитата E.A. @ Понимаю что это какие-то хомуты. Свою mystrtok() написать впринципе можно, но я не уверен что она будет достаточно быстрой, Если ты используешь strtok + strcpy то фактически перебираешь символы строки 2 раза. В самопале это можно совместить. Как-то так: читаем символ, если не "\t" или "\0" копируем его в результат. Если "\t", значит с этой ячейкой всё, переходим к следующей. Если "\0", значит разбор строки закончен. |
Сообщ.
#4
,
|
|
|
Даже ничего не понимая в алгоритме просто просится вариант: for (i=0; i<6400000; i++) { char tmp = e::strclipboardpaste[i]; if (tmp == '\t') { p = 0; j++; n = (j > n) ? j : n; continue; } if (tmp == '\r') { p = 0; j = 0; k++; m = (k > m) ? k : m; continue; } if (tmp == '\0') { n++; m++; break; } // if ((e::strclipboardpaste[i] != '\t') && (e::strclipboardpaste[i] != '\r') && (e::strclipboardpaste[i] != '\n') && (e::strclipboardpaste[i] != '\0')) // { e::strclipboardpastematrix[j][k][p] = tmp; p++; // } } Но всё-таки, на мой взгляд, алгоритм должен быть ещё проще. |
Сообщ.
#5
,
|
|
|
Цитата E.A. @ Есть строка в буфере обмена скопированная с Excel, которая представляет собой таблицу с разделителями строки (\r\n) ячейки (\t). Нужно эту строку преобразовать в массив. Максимальные возможные размеры 50 столбцов x 500 строк. Что-то подозреваю, объявлять гигантский массив char strclipboardpaste[6400000] не нужно. Твоя строка уже в памяти, в буфере обмена. Размер её, скорее всего известен, если нет - то она в любом случае заканчивается нулём. Ну и тип у неё скорее всего не char *, а wchar_t *; Так что там достаточно пробежаться по строке, и, по разделителям, сохранить элементы в std::vector<std::string>, вернее - там двумерная матрица, поэтому лучше в std::vector<std::vector<std::string>> Добавлено std::vector<std::vector<std::wstring>> |