1 / 1 / 0
Регистрация: 27.08.2009
Сообщений: 33
1

Разбиение строки на элементы

28.08.2009, 14:10. Показов 8919. Ответов 21
Метки нет (Все метки)

Есть у меня строка с ";" в качестве разделителя, подскажите как мне лучше разбить ее на элементы, на выходе я хочу получить массив этих элементов.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2009, 14:10
Ответы с готовыми решениями:

Разбиение строки по байтам
Добрый вечер =) В общем проблема такая.... у меня записаны в файле данные, в текстовом формате....

Разбиение строки по два элемента
Я в консоле сделал так, что введёное число переводится из 10 в 16 СС (например 20000 = 4Е20)....

Разбиение LeftAxis->Title на две строки в TChart
Здравствуйте! Есть ли возможность левую ось в графике TChart разбить на две строчки? ...

разбиение SQL на строки
как разбать SQL -команду на строки. Слишком длинная, код не читается совсем. пробвал сцеплением...

21
сишник
Автор FAQ
130 / 36 / 1
Регистрация: 25.07.2009
Сообщений: 291
28.08.2009, 14:15 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
AnsiString ss[100];
AnsiString input="123;abv;@#$";
AnsiString temp;
int count = 0;
for(int i=1;i<=input.Length();i++)
  {
    if(input[i] != ';')
    {
      temp += input[i];
    }
      else
       {
        if(count < 100)
          {
           ss[count] = temp;temp = "";count++;
          }
       }
    }
1
1 / 1 / 0
Регистрация: 27.08.2009
Сообщений: 33
28.08.2009, 14:22  [ТС] 3
Спасибо, извините за глупый вопрос, у меня трудность была в том, что я не знал размера выходного массива, но я подумал и решил что это для меня не так уж важно, можно задать заведомо больший размер.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2009, 14:33 4
для этого есть спец функция strtok
ну как-то так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define MAX_OUTPUT 10;
 
TCHAR input[]=_T("123;abv;@#$");
TCHAR *output[MAX_OUTPUT];
TCHAR *p;
 
p = tcstok( input );
int i=0;
_tprintf(_T("%s"),p);
output[i] = new TCHAR[tcslen(p)];
_tcscpy( output[i], p );
do{
    i++;
    p = tcstok( NULL, _T(";") );
    if( p ){
         _tprnitf( _T("/%s"),p );
        output[i] = new TCHAR[tcslen(p)];
        _tcscpy( output[i], p );
    }   
}while( NULL != p );
//потом все delete'им
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
28.08.2009, 14:51 5
А вот еще один вариант :
C++
1
2
3
4
5
6
7
8
9
10
11
12
  String input = "123;abv;@#$";
  TStringList *lst = new TStringList();
  try {
    TReplaceFlags fFlags;
    fFlags << rfReplaceAll;
    lst->Text = StringReplace(input, ";", "\r\n", fFlags);
    // теперь в lst три строки
    int amount = lst->Count;  // amount = 3
  }
  __finally {
    delete lst;
  }
2
1 / 1 / 0
Регистрация: 27.08.2009
Сообщений: 33
28.08.2009, 15:15  [ТС] 6
Цитата Сообщение от АНК Посмотреть сообщение
А вот еще один вариант :
C++
1
2
3
4
5
6
7
8
9
10
11
12
  String input = "123;abv;@#$";
  TStringList *lst = new TStringList();
  try {
    TReplaceFlags fFlags;
    fFlags << rfReplaceAll;
    lst->Text = StringReplace(input, ";", "\r\n", fFlags);
    // теперь в lst три строки
    int amount = lst->Count;  // amount = 3
  }
  __finally {
    delete lst;
  }
Интересный вариант, а для чего там try?
1
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2009, 15:17 7
видимо исключения от StringReplace хватать, когда заменять нечего будет
1
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
28.08.2009, 15:44 8
Блок
C++
1
2
3
4
5
6
  try {
      .....
  }
  __finally {
    .....
  }
поставил для безусловной "уборки мусора", т.к. кусок кода в __finally отработает не зависимо от того как отработал кусок кода в try
0
Заблокирован
Автор FAQ
28.08.2009, 16:13 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
47
48
49
50
51
52
53
54
55
#include <windows.h>
#include <stdio.h>
 
int * iPos = (int *)malloc(sizeof(int));
char * str = (char *)malloc(sizeof(char));
//Выделяет из строки подстроки, разделителем которых является ;
void GetWords(char * str, int * iPos, char ** sArray);
 
void main()
{
    int i = 0;iPos[0] = 0;
    printf("\tEnter string\r\n");
    while((str[i] = getchar()))
    {
        //&&0 < i - Вдруг по запаре нажмём Enter в самом начале
        if(str[i] == '\n'&&0 < i)
            break;
        if(str[i] == ';')
        {
            iPos[0]++;          //Подсчёт числа слов
            iPos = (int *)realloc((void *)iPos,sizeof(int)*(iPos[0] + 1));
            iPos[iPos[0]] = i;  //Запоминаем позицию где ; стоит
        }
        i++;
        //Динамически изменяем длинну строки 
        //под число введенных символов
        str = (char *)realloc(str,sizeof(char)*(i + 1));
    }
    str[i] = '\0';//Обязательно чтобы мусора не было!
    char ** sArray = new char * [iPos[0] + 1];
    GetWords(str, iPos, sArray);
    for(i = iPos[0]; 0 <= i; i--)
        printf("%s\r\n",sArray[i]);
    delete [] sArray;//Чистим память
    str = (char *)realloc(str,sizeof(char));
    iPos = (int *)realloc((void*)iPos,sizeof(int));
    printf("Press NUM1 for enter new string\r\n");
    scanf("%d",&i);
    if(i == 1)
        main();
}
 
void GetWords(char * str, int * iPos, char ** sArray)
{
    for(int i = iPos[0];0 < i; i--)
    {
        sArray[iPos[0] - i] = (char *)malloc(
            sizeof(char)*(iPos[i] - iPos[i - 1]));
        strcpy(sArray[iPos[0] - i],(str + iPos[i] + 1));
        str[iPos[i]] = '\0';
    }
    sArray[iPos[0] - i] = (char *)malloc(
            sizeof(char)*(strlen(str)));
    strcpy(sArray[iPos[0] - i],str);
}
Миниатюры
Разбиение строки на элементы  
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2009, 16:36 10
Цитата Сообщение от АНК Посмотреть сообщение
Блок
C++
1
2
3
4
5
6
  [B]__try [/B]{
      .....
  }
  __finally {
    .....
  }
поставил для безусловной "уборки мусора", т.к. кусок кода в __finally отработает не зависимо от того как отработал кусок кода в try
а, ясно
0
Супер-модератор
8781 / 2532 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
29.08.2009, 09:46 11
вот функция, которая формирует TStringList из входящей строки по заданному разделителю
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void AnalizeAnswer(AnsiString Text, TStringList* Block, char Delimiter)
{
  AnsiString Str = Text, tmp = "";
  while(!Str.IsEmpty()){
    if(!Str.Pos(AnsiString(Delimiter))) break;
    tmp = ((Str.SubString(1, Str.Pos(AnsiString(Delimiter)) - 1)).TrimLeft()).TrimRight();
    Block->Add(tmp);
    Str.Delete(1, Str.Pos(AnsiString(Delimiter)));
  }
  if(!Str.IsEmpty()){
    tmp = ((Str).TrimLeft()).TrimRight();
    Block->Add(tmp);
  }
}
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
29.08.2009, 14:31 12
Цитата Сообщение от VoodooMan Посмотреть сообщение
if(!Str.Pos(AnsiString(Delimiter))) break;
Поскольку функция POS возвращает int коректней будет так:
C++
1
if(Str.Pos(AnsiString(Delimiter)) == 0) break;
А в остальном всё супер
0
Супер-модератор
8781 / 2532 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
30.08.2009, 10:01 13
АНК, а какая разница?
0
Эксперт С++
7175 / 3234 / 80
Регистрация: 17.06.2009
Сообщений: 14,164
30.08.2009, 12:48 14
Я бы тоже так писал, хотя язык позволяет писать по-разному.
Оператор !variable - это скорее логическое выражение.
А если есть функция которую нужно проверить на 0, то предпочитаю писать так:
if ( func( args... ) == 0 ) { ... }
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
30.08.2009, 13:16 15
В VCL по умолчанию "0" это "false", а все остальное - "true". Но это правило выполняется не всеми компиляторами.
0
Супер-модератор
8781 / 2532 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
30.08.2009, 13:24 16
а мой код под билдер, сугубо под него... я же не обещал процедуру под любой компилер
0
28 / 19 / 16
Регистрация: 09.12.2009
Сообщений: 135
29.05.2011, 18:21 17
Господь Б-г... Ничегонепонял.jpg
Объясните, пожалуйста, дураку, почему вот это работает не так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void raz()
{
for (int i=0;i<=Form1->Memo1->Lines->Count;i++)
 {
  char * pch;
  pch = strtok (Form1->Memo1->Lines->Strings[i].c_str()," ");
  while (pch != NULL)
  {
   Form1->Memo2->Lines->Add(pch);
   pch = strtok (NULL, " ");
  }
 }
}
На выходе в строках второго мемо только первые цифры, а нужны все. В чем ошибка, подскажите, пожалуйста... Т__Т

Студент-неудачник-кун.
0
LK
Заблокирован
29.05.2011, 18:29 18
C++
1
i<=Form1->Memo1->Lines->Count-1;
и для чего там второй цикл, может, достаточно условия
1
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
29.05.2011, 21:02 19
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
tmp = ((Str).TrimLeft()).TrimRight();
А почему нельзя просто
C++
1
tmp = Str.Trim();
Добавлено через 6 минут
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
вот функция, которая формирует TStringList из входящей строки по заданному разделителю
И почему не воспользоваться стандартными функциями TStringList ?
C++
1
2
3
4
5
const AnsiString sText = "asdf;asdf;asdfasdf;asdf";
std::auto_ptr<TStringList>NewList(new TStringList);
NewList->StrictDelimiter = true;
NewList->Delimiter = ';';
NewList->DelimitedText = sText;
Output:
NewList->Text
[0] asdf
[1] asdf
[2] asdfasdf
[3] asdf
0
LK
Заблокирован
29.05.2011, 21:21 20
C++
1
2
3
4
AnsiString str = Memo1->Text;
TSysCharSet Tws,Tcs; // is a set containing ANSI characters
Tcs<<';'; //
ExtractStrings(Tcs,Tws,str.c_str(),Memo2->Lines);
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2011, 21:21
Помогаю со студенческими работами здесь

Разбиение строки на на логические элементы
Как разбить строку вида k*x^n, где k-double, n-double, x-char на соответственно k-double, n-double,...

разбиение строки
Доброго времени суток. В бд в одном поле хранится к примеру три числа через &quot;;&quot; (10; 20; 30;). И...

Разбиение строки
И снова здравствуйте, форумчане. Делал одно приложение и возникла загвоздка. Приложение принимает...

Разбиение строки
как разбить строку (&quot;432,543,345&quot;) на части по запятым , и записать эти числа как переменные?


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru