На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Преобразовать строку в массив , Си
    Есть строка в буфере обмена скопированная с Excel, которая представляет собой таблицу с разделителями строки (\r\n) ячейки (\t).
    Нужно эту строку преобразовать в массив. Максимальные возможные размеры 50 столбцов x 500 строк.
    ExpandedWrap disabled
          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++;
              }
          }

    Почему этот код не работает ?
    Сообщение отредактировано: E.A. -
      Цитата E.A. @
      Как лучше решить эту проблему ?

      я бы просто решил проблему "вручную".
      Надо написать процедуру, которая будет разбирать
      строку. Искать разделитель "\t" и куски между разделителями
      копировать в результирующий массив.
      Если размер куска равен 0, значит копируем 0 байт в массив-результат.
      Ничего сложного, гимнастика ума.
      ---
      Меня терзают смутные сомнения..
      ExpandedWrap disabled
            char strclipboardpaste[6400000]; // <- строка из буфера обмена
            char strclipboardpastematrix[50][500][256];
            char strclipboardpastevector[500][12800];

      Это где создаётся ? В стеке ?
        Цитата E.A. @
        Понимаю что это какие-то хомуты. Свою mystrtok() написать впринципе можно, но я не уверен что она будет достаточно быстрой,

        Если ты используешь strtok + strcpy то фактически перебираешь
        символы строки 2 раза.
        В самопале это можно совместить.
        Как-то так:
        читаем символ, если не "\t" или "\0" копируем его в результат.
        Если "\t", значит с этой ячейкой всё, переходим к следующей.
        Если "\0", значит разбор строки закончен.
          Цитата E.A. @
          Сделал все-таки самопал

          Даже ничего не понимая в алгоритме просто просится вариант:
          ExpandedWrap disabled
            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++;
            //    }
            }

          Но всё-таки, на мой взгляд, алгоритм должен быть ещё проще.
          Сообщение отредактировано: ЫукпШ -
            Цитата 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>>
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0305 ]   [ 17 queries used ]   [ Generated: 28.03.24, 17:47 GMT ]