Функция обработки строки
От: ZmaximI  
Дата: 24.05.04 10:21
Оценка:
Уважаемые мастера, помогите пожалуйста, СРОЧНО нужна
функция NXT_BLNK(str,pos),которая анализирует строку
str, начиная с позиции pos, и возвращает номер первого найденого пробела.
Если пробела нет, то возвращает 0; если pos<0, то возвращается -1.
Re: Функция обработки строки
От: jazzer Россия Skype: enerjazzer
Дата: 24.05.04 10:39
Оценка:
Здравствуйте, ZmaximI, Вы писали:

ZI>Уважаемые мастера, помогите пожалуйста, СРОЧНО нужна

ZI>функция NXT_BLNK(str,pos),которая анализирует строку
ZI>str, начиная с позиции pos, и возвращает номер первого найденого пробела.
ZI>Если пробела нет, то возвращает 0; если pos<0, то возвращается -1.

std::string::size_type NXT_BLNK(const std::string& s, const std::string::size_type& pos)
{
  if (pos<0) return -1;
  if (std::string::size_type i = s.find(' ', pos) != std::string::npos)
   return i;
  else
   return 0;
}
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Функция обработки строки
От: Vamp Россия  
Дата: 24.05.04 10:40
Оценка:
Ты опишу свою трудность, мы попробуем помочь.


ZI>Уважаемые мастера, помогите пожалуйста, СРОЧНО нужна

ZI>функция NXT_BLNK(str,pos),которая анализирует строку
ZI>str, начиная с позиции pos, и возвращает номер первого найденого пробела.
ZI>Если пробела нет, то возвращает 0; если pos<0, то возвращается -1.
Да здравствует мыло душистое и веревка пушистая.
Re: Функция обработки строки
От: Тим Россия  
Дата: 24.05.04 10:45
Оценка:
Здравствуйте, ZmaximI, Вы писали:

ZI>Уважаемые мастера, помогите пожалуйста, СРОЧНО нужна

ZI>функция NXT_BLNK(str,pos),которая анализирует строку
ZI>str, начиная с позиции pos, и возвращает номер первого найденого пробела.
ZI>Если пробела нет, то возвращает 0; если pos<0, то возвращается -1.

Для С — строки можно так:

 int NXT_BLNK(char* str, int pos){
   if (pos<0)
     return -1;
   for(int i=0; str[i]; ++i)
     if (str[i] == ' ')
       return i; 
   return 0;
 }
Re[2]: Функция обработки строки
От: Vamp Россия  
Дата: 24.05.04 10:54
Оценка: +2
Приведенный код не решает поставленную задачу.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Функция обработки строки
От: Тим Россия  
Дата: 24.05.04 10:58
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Приведенный код не решает поставленную задачу.


Согласен, проглядел, про, начиная с pos.

int NXT_BLNK(char* str, int pos){
   if (pos<0)
     return -1;
   for(int i= pos; str[i]; ++i)
     if (str[i] == ' ')
       return i; 
   return 0;
 }
Re[3]: Функция обработки строки
От: Тим Россия  
Дата: 24.05.04 11:05
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Приведенный код не решает поставленную задачу.


А еще интересно номер пробела интересует от начала строки или, тоже от pos?
Re[2]: Функция обработки строки
От: Vamp Россия  
Дата: 24.05.04 11:06
Оценка:
std::iterator_traits<ForwardIterator>::difference_type NXT_BLNK(const std::string& s, const std::string::size_type& pos) {
    if (pos < 0 || pos > s.size()) 
        return -1;
    std::string::const_iterator it=std::find(std::advance(s.begin(), pos), s.end());
    if (it==s.end())
       return 0;
    else 
       std::distance (it, s.begin());
}
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Функция обработки строки
От: jazzer Россия Skype: enerjazzer
Дата: 24.05.04 11:27
Оценка:
Здравствуйте, Vamp, Вы писали:

V>
V>std::iterator_traits<ForwardIterator>::difference_type NXT_BLNK(const std::string& s, const std::string::size_type& pos) {
V>    if (pos < 0 || pos > s.size()) 
V>        return -1;
V>    std::string::const_iterator it=std::find(std::advance(s.begin(), pos), s.end());
V>    if (it==s.end())
V>       return 0;
V>    else 
V>       std::distance (it, s.begin());
V>}
V>


и чем твой вариант лучше? :))))
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Функция обработки строки
От: Vamp Россия  
Дата: 24.05.04 11:32
Оценка: :))
Ничем.
Запутаннее.
Да здравствует мыло душистое и веревка пушистая.
Re: Функция обработки строки
От: Кодт Россия  
Дата: 24.05.04 11:34
Оценка: 3 (1) +1
Здравствуйте, ZmaximI, Вы писали:

ZI>Уважаемые мастера, помогите пожалуйста, СРОЧНО нужна

ZI>функция NXT_BLNK(str,pos),которая анализирует строку
ZI>str, начиная с позиции pos, и возвращает номер первого найденого пробела.
ZI>Если пробела нет, то возвращает 0; если pos<0, то возвращается -1.

(Кто такие имена функций придумывает? )

Возвращать 0 при обломе некошерно, т.к. если пробел стоит в начале, то его номер — тоже 0.
Если бы не требование — позиция как аргумент функции — то достаточно было бы функций
strchr(str,' ')
или
strcspn(str," ")
А так придётся ещё проверять, не выбежала ли она за конец строки.
// возвращает -1 при любых обломах
int next_blank(const char* str, int pos)
{
  if(!str) return -1;
  if(pos<0) return -1;
  int k = 0;
  while(str[k] != 0 && (k < pos || str[k] != ' ')) ++k;
  if(str[k] == 0) return -1;
  return k;
}


Если длина известна заранее, то можно быстрее:
int next_blank(const std::string& str, int pos)
{
  if(pos < 0 || pos >= str.size()) return -1;
  pos = str.find(' ',pos);
  if(pos == std::string::npos) return -1;
  return pos;
}
Перекуём баги на фичи!
Re[2]: Функция обработки строки
От: Plague Россия 177230800
Дата: 24.05.04 14:05
Оценка:
Можно и так:
int next_blank(const char* str, int pos)
{
    if(pos<0) return -1;
    while(*(str+pos)) if(' ' == *(str+pos)) return pos; else ++pos;
    return 0;
}
... << RSDN@Home 1.1.3 stable >>
Re: Функция обработки строки
От: ilya_ny  
Дата: 24.05.04 14:18
Оценка:
Здравствуйте, ZmaximI, Вы писали:

ZI>Уважаемые мастера, помогите пожалуйста, СРОЧНО нужна

ZI>функция NXT_BLNK(str,pos),которая анализирует строку
ZI>str, начиная с позиции pos, и возвращает номер первого найденого пробела.
ZI>Если пробела нет, то возвращает 0; если pos<0, то возвращается -1.

а если строка начинается с пробела и pos = 0??
тогда :

NXT_BLNK(" abc", 0) = 0

но по логике задачи это означает, что пробела нет.. неоднозначность
Re[3]: Функция обработки строки
От: Dog  
Дата: 24.05.04 14:24
Оценка: +1
P>Можно и так:
P>
P>int next_blank(const char* str, int pos)
P>{
P>    if(pos<0) return -1;
P>    while(*(str+pos)) if(' ' == *(str+pos)) return pos; else ++pos;
P>    return 0;
P>}
P>

угу, длина строки 10, pos = 20 ... и понеслась душа в рай
Re[2]: Функция обработки строки
От: Lorenzo_LAMAS  
Дата: 24.05.04 14:25
Оценка:
что такое std::string::size_type и что будет std::string::size_type(-1) ?
Of course, the code must be complete enough to compile and link.
Re[3]: Функция обработки строки
От: jazzer Россия Skype: enerjazzer
Дата: 24.05.04 14:28
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>что такое std::string::size_type и что будет std::string::size_type(-1) ?


а ты полюбопытствуй в Стандарте :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Ввод строки и вывод номера позиции
От: ZmaximI  
Дата: 24.05.04 15:49
Оценка:
Здравствуйте, Тим, Вы писали:


Тим>
Тим>int NXT_BLNK(char* str, int pos){
Тим>   if (pos<0)
Тим>     return -1;
Тим>   for(int i= pos; str[i]; ++i)
Тим>     if (str[i] == ' ')
Тим>       return i; 
Тим>   return 0;
Тим> }
Тим>


Всем огромное спасибо за функцию.
Есть еще вопрос
как в эту функцию передать строку и вывести номер позиции с пробелом.
Re[4]: Функция обработки строки
От: rus blood Россия  
Дата: 24.05.04 17:11
Оценка:
Здравствуйте, Тим, Вы писали:

Тим>Здравствуйте, Vamp, Вы писали:


V>>Приведенный код не решает поставленную задачу.


Тим>Согласен, проглядел, про, начиная с pos.


Тим>
Тим>int NXT_BLNK(char* str, int pos){
Тим>   if (pos<0)
Тим>     return -1;
Тим>   for(int i= pos; str[i]; ++i)
Тим>     if (str[i] == ' ')
Тим>       return i; 
Тим>   return 0;
Тим> }
Тим>


Сие неверно, если pos больше, чем длина строки...
Имею скафандр — готов путешествовать!
Re[2]: Функция обработки строки
От: rus blood Россия  
Дата: 24.05.04 17:12
Оценка: 4 (1)
К>Если бы не требование — позиция как аргумент функции — то достаточно было бы функций
К>strchr(str,' ')
К>или
К>strcspn(str," ")

Чем плохо strchr(str + pos, ' ')?
Понятно, что pos надо сравнить с длиной строки сначала...
Имею скафандр — готов путешествовать!
Re[3]: Функция обработки строки
От: Кодт Россия  
Дата: 24.05.04 17:18
Оценка:
Здравствуйте, rus blood, Вы писали:

К>>Если бы не требование — позиция как аргумент функции — то достаточно было бы функций

К>>strchr(str,' ')
К>>или
К>>strcspn(str," ")

RB>Чем плохо strchr(str + pos, ' ')?

RB>Понятно, что pos надо сравнить с длиной строки сначала...

Уже говорили, что нужно следить за габаритами.
int next_blank(const char* s, int p)
{
  if(p < 0 || p > strlen(s)) return -1;
  // v1
  const char* t = strchr(s+p,' ');
  if(!t) return -1;
  return t-p;
  // v2
  int n = strcspn(s+p," "); // удобно, если ищем не только пробел, но и, например, табуляцию
  if(s[n]==0) return -1;
  return p+n;
}

Ну и получается, что сперва сбегали от начала до конца, а затем ещё раз — от позиции до следующего пробела.
Лишняя работа.
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.