Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите пожалуйста (по работе со строкой) 
:(
    Опции темы
illspirit
Дата 23.9.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.9.2008

Репутация: нет
Всего: нет



Нужно, скажем из такой строки:
123 dsfj 10a 5 a 6 
Выделить числа (желательно их в массив запихать), т.е. в данном случае должнен получиться массив с элементами 123, 5 и 6.
Пожалуйста подскажите как это сделать.
PM MAIL   Вверх
bsa
Дата 23.9.2008, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



читай про стандартные функции strtok (или strsep) и strspn
PM   Вверх
illspirit
Дата 23.9.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.9.2008

Репутация: нет
Всего: нет



Цитата

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

Со strtok'ом понятно, имел дело.
А как через strspn определение числа сделать - несколько не понятно. В множество символов, с которым сравниваю, всё кроме чисел пихать или наоборот числа - и как с результатом связать?
PM MAIL   Вверх
susanin
Дата 24.9.2008, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: 2
Всего: 7



посматриваешь строку, если встрчается первое число isdigit то начинаешь цикл начиная с этого элемента и пока  очередной элемент !isdigit (не число) в tmp строку записываешь конкатенацией полученные цифры, а потом функцией перевода строки в число переводишь tmp строку в число и запихиваешь в массив.. и так далее до конца строки
PM MAIL   Вверх
Dov
Дата 24.9.2008, 03:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(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] == ' ')
...




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
illspirit
Дата 24.9.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.9.2008

Репутация: нет
Всего: нет



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 не  нужна что-ли?

Не нужна.
PM MAIL   Вверх
Dov
Дата 26.9.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



illspirit, я с ВСВ, к сожалению, тебе помочь не смогу.  


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1415 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.