Разбиение строки с разделителем на подстроки (С++)
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Разбиение строки с разделителем на подстроки (С++) - 2006-08-02 01:42:37
|
|
|
voody
Сообщений: 958
Оценки: 0
Присоединился: 2005-02-06 22:28:30
|
Всем привет! Есть строка (массив char) приблизительно следующего содержания: char string[] = "Line_1\nLine_2\nLine_3\nLine_4"; Каким образом можно текст между \n(т.е. Line_1, Line_2, и т.д.) поместить построчно в TListBox в C++ Builder''е? Т.е. нужно разбить строку на массив подстрок с разделителем \n. Знаю, что в PHP и в JavaSсгiрt есть такая функция, а это си-подобные языки. Может и в C++ такая функция тоже есть? Заранее спасибо за помощь!
|
|
|
Разбиение строки с разделителем на подстроки (С++) - 2006-08-03 21:36:50
|
|
|
Kill_em_all
Сообщений: 395
Оценки: 0
Присоединился: 2005-03-25 22:40:01
|
Не знаю как в билдере, а в MS VC++ так(возможны ошибки):
char string[1024]; char parsed[]; int i=0; strcpy(string,"Line_1\nLine_2\nLine_3\nLine_4"); char temp=strtok(string, "\n"); while(temp) { temp=strtok(NULL, "\n"); if(!temp) break; strcpy(parsed,temp);<BR> i++;<BR>}
|
|
|
Разбиение строки с разделителем на подстроки (С++) - 2006-08-04 00:25:11
|
|
|
ien
Сообщений: 18
Оценки: 0
Присоединился: 2004-08-20 00:12:46
|
int GetParamFromStringAmount(char* szString, char chSep, int iAmount) { szString[iAmount] = 0; int iCounter = 0; iAmount = 0; while(szString[iAmount]) { if(szString[iAmount] == chSep) iCounter++; iAmount++; } return iCounter + 1; } char* GetParamFromString(char* szString, char chSep, int iAmount, int iNumb) { szString[iAmount] = 0; iAmount = 0; while((iNumb > 0) && (szString[iAmount])) { if((szString[iAmount] == chSep) || (szString[iAmount] == 0)) iNumb–; iAmount++; } if(iNumb != 0) return NULL; iNumb = iAmount; while(szString[iNumb]) { if(szString[iNumb] == chSep) break; iNumb++; } iNumb -= iAmount; iNumb++; char *a = new char[iNumb]; if(a == 0) return NULL; for(int i = 0; i < iNumb; i++) a = szString;<BR> a[iNumb - 1] = 0;<BR> return a;<BR>}<BR><BR>Извини, мне слегка лениво что-то еще писать…<BR>Это фрагмент из моей "НеСтандартной библиотеки"( NSTL =) ).<BR>Первая процедура выдает количество элементов по строке и расзделителю.<BR>Вторая - выдает сами элементы.<BR>Думается, что посидев минут 15 сделаешь то, что надо и может найдешь пару ошибок =) .<BR>вот тут тоже самое, но с табуляциями… =)
|
|
|
Разбиение строки с разделителем на подстроки (С++) - 2006-08-04 02:54:53
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
как всё сложно и мудрёно вы делаете…
вот как надо. никаких левых выделений/освобождений памяти. можно конечно ещё поыбаццо, чтобы str_start убрать и поменьше проверок во внутреннем цикле сделать (хотя компилер должён вроде это сам сделать), но кому надо, тот пускай этим и занимается. char *str = "line1\nline2\nline3\nline4"; char *start, *end; int str_ends = 0;
for (start = str; !str_ends; start = end) { for (end = start; end != '\0'; end ++) { if (*end == '\n') *end = '\0'; else if (*end == '\0') str_ends = 1; } /* здесь мы имеем вполне себе C строку. её можно куда-нть скопировать используя strcpy * я воспользуюсь гипотетической функцией add_line_to_tlistbox, * которая ничего не знает про происхождение строки и её дальнейшую судьбу */ add_line_to_tlistbox (start); if (!str_ends) *end = '\n'; /* вернём всё взад как было */ }
единственный небонус такого подхода – не получиться на str навесить modifier const. Но это уже мелочи.
|
|
|
Разбиение строки с разделителем на подстроки (С++) - 2006-08-04 04:38:08
|
|
|
voody
Сообщений: 958
Оценки: 0
Присоединился: 2005-02-06 22:28:30
|
Всем спасибо за помощь! Выбрал самый простой вариант с strtok:
char string[] = "Line_1\nLine_2\nLine_3\nLine_4"; char *substring = strtok(string, "\n"); ListBox1->Items->Add(AnsiString(substring)); for (;;) { substring = strtok(NULL, "\n"); if (substring == NULL) break; ListBox1->Items->Add(AnsiString(substring)); }
|
|
|
Разбиение строки с разделителем на подстроки (С++) - 2006-08-06 02:05:29
|
|
|
ien
Сообщений: 18
Оценки: 0
Присоединился: 2004-08-20 00:12:46
|
> как всё сложно и мудрёно вы делаете… Извини пжлста… но в том, что ты написал… нет функционала того, что написал я… Да, я решаю более общую проблему, однако, мне казалось, что автору темы охота написать что-то наподобие explode() в php… >Выбрал самый простой вариант с strtok Правильно! =)
|
|
|
|
|