F> А char* учили уже? Тогда позволю себе в порядке личного безумия запостить сию поделку F> (поковырялся минут пять и написал страх божий ):
А я позволю себе (тоже в порядке личного безумия) порекомендовать стандартную функцию strtok.
Ну и пример к ней из MSDN:
Example// crt_strtok.c
/* In this program, a loop uses strtok
* to print all the tokens (separated by commas
* or blanks) in the string named "string".
*/#include <string.h>
#include <stdio.h>
char string[] = "A string\tof ,,tokens\nand some more tokens";
char seps[] = " ,\t\n";
char *token;
int main( void )
{
printf( "Tokens:\n" );
/* Establish string and get the first token: */
token = strtok( string, seps );
while( token != NULL )
{
/* While there are tokens in "string" */
printf( " %s\n", token );
/* Get next token: */
token = strtok( NULL, seps );
}
}
Output
Tokens:
A
string
of
tokens
and
some
more
tokens
<...покоцано...>
B>Мне не поверят =( Моя маленькая курсовая програмка просто не может столько всего в себя включать... =((( Спасибо все равно.
Я не совсем понял в чем проблема, если честно Если "столько всего" это 2 инклуда — то без них все равно не получится использовать классы string и vector. Если нет — тогда что?
Здравствуйте, Peregrin, Вы писали:
P>Здравствуйте, Blitz, Вы писали:
P><...покоцано...>
B>>Мне не поверят =( Моя маленькая курсовая програмка просто не может столько всего в себя включать... =((( Спасибо все равно. P>Я не совсем понял в чем проблема, если честно Если "столько всего" это 2 инклуда — то без них все равно не получится использовать классы string и vector. Если нет — тогда что?
Да я понимаю, просто... нас официально string на c++ еще не учили (это я еще с Java их очень люблю), поэтому решила использовать их класс... Но в Java-то обычно все уже до тебя написано (думала, что такая функция уже есть, а тут =((), поэтому я не думала, что придется так глубоко в string закапываться. Если не проходили — не поверят. Они такие, эти лекторы фиговы...
Здравствуйте, Blitz, Вы писали:
B>Они такие, эти лекторы фиговы...
[offtop ]
А если они читают? Хотя ели ты действительно из Ноттингема врятли ( даа во истину широка аудитория RSDN ).
Но один Астраханский зав. кафедрой тут точно все читает.
[/offtop ]
А вобще чтоли нельзя сказать им что тебе на форуме об этом расказали?
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Blitz, Вы писали:
B>>Они такие, эти лекторы фиговы... WH>[offtop ] WH>А если они читают? Хотя ели ты действительно из Ноттингема врятли ( даа во истину широка аудитория RSDN ). WH>Но один Астраханский зав. кафедрой тут точно все читает. WH>[/offtop ] WH>А вобще чтоли нельзя сказать им что тебе на форуме об этом расказали?
[]
B>Да я понимаю, просто... нас официально string на c++ еще не учили (это я еще с Java их очень люблю), поэтому решила использовать их класс... Но в Java-то обычно все уже до тебя написано (думала, что такая функция уже есть, а тут =((), поэтому я не думала, что придется так глубоко в string закапываться. Если не проходили — не поверят. Они такие, эти лекторы фиговы...
А char* учили уже? Тогда позволю себе в порядке личного безумия запостить сию поделку (поковырялся минут пять и написал страх божий ):
//---------------------------------------------------------------------------char* source_string = "I love \t\n C++";
//---------------------------------------------------------------------------bool is_separator(const char* separators, char c)
{
// проверяет, является ли символ разделительнымchar ch;
while((ch = *separators++))
if(ch == c)
return true;
return false;
}
//---------------------------------------------------------------------------char* skip_separators(const char* source,const char* separators)
{
// пропускает разделительные символы в начале строкиconst char* c = source;
while(*c && is_separator(separators,*c))
c++;
return (char*)c;
}
//---------------------------------------------------------------------------char** split_string(const char* source, const char* separators, int& result_count)
{
// разбивает строку на массив строк по разделителям
result_count = 0;
// простая проверка корректности параметровif(!source || !*source)
return NULL;
char ch;
char** result = NULL;
// устанавливаем указатель на первый несепараторconst char* walker = skip_separators(source,separators);
const char* word_begin = walker;
if(!*walker)
return NULL;
int len = strlen(source);
// и ходим по символам до конца строки, запоминая начало слова и его конецwhile((ch = *walker++), (walker <= &source[len+2]))
{
if(is_separator(separators,ch))
{
int word_len = walker - word_begin;
char* word = new char[word_len];
memcpy(word,word_begin,word_len-1);
word[word_len-1] = 0;
result_count++;
if(!result)
{
result = new char*[result_count];
result[0] = word;
} // if(!result)else
{
char** new_result = new char*[result_count];
for(int i=0;i<result_count-1;i++)
new_result[i] = result[i];
new_result[result_count-1] = word;
delete [] result;
result = new_result;
}
walker = skip_separators(walker,separators);
word_begin = walker;
walker++;
} // if(is_separator
} // whilereturn result;
}
//---------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Clear();
int cnt;
char** arr = split_string(source_string," \t\r\n",cnt);
if(arr)
{
for(int i=0;i<cnt;i++)
{
Memo1->Lines->Add(arr[i]);
delete [] arr[i];
} // fordelete [] arr;
} // if(arr)
}
//---------------------------------------------------------------------------