С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/47: Рейтинг темы: голосов - 47, средняя оценка - 4.72
 Аватар для Beowolf
1 / 1 / 0
Регистрация: 27.08.2009
Сообщений: 33

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

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

Студворк — интернет-сервис помощи студентам
Есть у меня строка с ";" в качестве разделителя, подскажите как мне лучше разбить ее на элементы, на выходе я хочу получить массив этих элементов.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.08.2009, 14:10
Ответы с готовыми решениями:

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

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

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

21
сишник
Автор FAQ
130 / 36 / 1
Регистрация: 25.07.2009
Сообщений: 291
28.08.2009, 14:15
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
 Аватар для Beowolf
1 / 1 / 0
Регистрация: 27.08.2009
Сообщений: 33
28.08.2009, 14:22  [ТС]
Спасибо, извините за глупый вопрос, у меня трудность была в том, что я не знал размера выходного массива, но я подумал и решил что это для меня не так уж важно, можно задать заведомо больший размер.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2009, 14:33
для этого есть спец функция 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
А вот еще один вариант :
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
 Аватар для Beowolf
1 / 1 / 0
Регистрация: 27.08.2009
Сообщений: 33
28.08.2009, 15:15  [ТС]
Цитата Сообщение от АНК Посмотреть сообщение
А вот еще один вариант :
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
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2009, 15:17
видимо исключения от StringReplace хватать, когда заменять нечего будет
1
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
28.08.2009, 15:44
Блок
C++
1
2
3
4
5
6
  try {
      .....
  }
  __finally {
    .....
  }
поставил для безусловной "уборки мусора", т.к. кусок кода в __finally отработает не зависимо от того как отработал кусок кода в try
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
28.08.2009, 16:13
Вот текст проги, думаю в нём само за себя всё говорит,
старался всё детально коментить...

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
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2009, 16:36
Цитата Сообщение от АНК Посмотреть сообщение
Блок
C++
1
2
3
4
5
6
  [B]__try [/B]{
      .....
  }
  __finally {
    .....
  }
поставил для безусловной "уборки мусора", т.к. кусок кода в __finally отработает не зависимо от того как отработал кусок кода в try
а, ясно
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
29.08.2009, 09:46
вот функция, которая формирует 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
Цитата Сообщение от VoodooMan Посмотреть сообщение
if(!Str.Pos(AnsiString(Delimiter))) break;
Поскольку функция POS возвращает int коректней будет так:
C++
1
if(Str.Pos(AnsiString(Delimiter)) == 0) break;
А в остальном всё супер
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
30.08.2009, 10:01
АНК, а какая разница?
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
30.08.2009, 12:48
Я бы тоже так писал, хотя язык позволяет писать по-разному.
Оператор !variable - это скорее логическое выражение.
А если есть функция которую нужно проверить на 0, то предпочитаю писать так:
if ( func( args... ) == 0 ) { ... }
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
30.08.2009, 13:16
В VCL по умолчанию "0" это "false", а все остальное - "true". Но это правило выполняется не всеми компиляторами.
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
30.08.2009, 13:24
а мой код под билдер, сугубо под него... я же не обещал процедуру под любой компилер
0
 Аватар для Syrax
28 / 19 / 16
Регистрация: 09.12.2009
Сообщений: 135
29.05.2011, 18:21
Господь Б-г... Ничегонепонял.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
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
29.05.2011, 18:29
C++
1
i<=Form1->Memo1->Lines->Count-1;
и для чего там второй цикл, может, достаточно условия
1
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
29.05.2011, 21:02
Цитата Сообщение от 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
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
29.05.2011, 21:21
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.05.2011, 21:21
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru