Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Подскажите пожалуйста (по работе со строкой)


Автор: illspirit 23.9.2008, 19:29
Нужно, скажем из такой строки:
123 dsfj 10a 5 a 6 
Выделить числа (желательно их в массив запихать), т.е. в данном случае должнен получиться массив с элементами 123, 5 и 6.
Пожалуйста подскажите как это сделать.

Автор: bsa 23.9.2008, 19:53
читай про стандартные функции strtok (или strsep) и strspn

Автор: illspirit 23.9.2008, 21:58
Цитата

читай про стандартные функции strtok (или strsep) и strspn

Со strtok'ом понятно, имел дело.
А как через strspn определение числа сделать - несколько не понятно. В множество символов, с которым сравниваю, всё кроме чисел пихать или наоборот числа - и как с результатом связать?

Автор: susanin 24.9.2008, 02:01
посматриваешь строку, если встрчается первое число isdigit то начинаешь цикл начиная с этого элемента и пока  очередной элемент !isdigit (не число) в tmp строку записываешь конкатенацией полученные цифры, а потом функцией перевода строки в число переводишь tmp строку в число и запихиваешь в массив.. и так далее до конца строки

Автор: Dov 24.9.2008, 03:54
Цитата(illspirit @  23.9.2008,  19:29 Найти цитируемый пост)
...123 dsfj 10a 5 a 6...
...  т.е. в данном случае должнен получиться массив с элементами 123, 5 и 6...

А 10 не  нужна что-ли?

Если не нужна, то можно так.
Код
#define SIZE 256

int main()
{    
    char   str[SIZE]  =  "123 dsfj 10a 5 a 6 ";    
    char   num[SIZE];
    int    arr[SIZE]  = {0};
    int    i          = 0,
           j          = 0,
           len;

    for(char* p = str; p = strpbrk(p, "0123456789"); p += len)
    {
        sscanf_s(p, "%[0-9 ]s", num, SIZE); // между '9' и ']' должен быть один пробел, вот так: [0-9 ]
        len = (int)strlen(num);
        if(num[len - 1] == ' ')
            arr[j++] = atoi(num);        
    }

    while(j--)
        cout << arr[i++] << ' ';

    cout << endl;    
    return 0;
}


Добавлено через 3 минуты и 18 секунд
А если 10 нужна, то так:
Код

...
   //  if(num[len - 1] == ' ')
...


Автор: illspirit 24.9.2008, 22:24
Dov, большое спасибо. Единственное с чем проблема - с return 0 - он должен с main'ом работать, а хотелось бы без main'а это сделать (BCB) - можно его чем нибудь заменить?
Вот кстати код:
Код

void __fastcall TForm2::Button1Click(TObject *Sender)

{
TStringList *lst = new TStringList;
AnsiString p;
char   num[SIZE];
int    arr[SIZE]  = {0};
int    i = 0, j = 0, len, s, n = 0;

if (OpenDialog1->Execute()) ;
lst->LoadFromFile(OpenDialog1->FileName);
p = lst->Text;
char *x = p.c_str();
for(x; x = strpbrk(x, "0123456789"); x += len)
    {
        sscanf(x, "%[0-9 ]s", num, SIZE);
        len = (int)strlen(num);
        if(num[len - 1] == ' ')
           arr[j++] = atoi(num);
    }

    while(j--)
        cout << arr[i++] << ' ';

    cout << endl;
    //return 0;  - на него ругается
// Для проверки:
for(n;n<10;n++)
{
s=arr[n];
Memo1->Lines->Add(s);
}
}

Цитата

А 10 не  нужна что-ли?

Не нужна.

Автор: Dov 26.9.2008, 10:41
illspirit, я с ВСВ, к сожалению, тебе помочь не смогу.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)