Функция обработки строки
От: 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;
}

Ну и получается, что сперва сбегали от начала до конца, а затем ещё раз — от позиции до следующего пробела.
Лишняя работа.
Перекуём баги на фичи!
Re[4]: Функция обработки строки
От: rus blood Россия  
Дата: 24.05.04 17:28
Оценка:
К>Ну и получается, что сперва сбегали от начала до конца, а затем ещё раз — от позиции до следующего пробела.
К>Лишняя работа.

Понятно, что лишняя. И хорошо бы, если бы длина была известна заранее (string).

Но насколько мне казалось, функции strlen и strchr работают гораздо быстрее банальных переборов по одному символу.
Насколько я понимаю, эти функции проверяют сразу четверки символов — оптимизатор не сможет сделать то же самое из обычного цикла "по символу".
Имею скафандр — готов путешествовать!
Re[5]: Функция обработки строки
От: Кодт Россия  
Дата: 24.05.04 17:47
Оценка: -1
Здравствуйте, rus blood, Вы писали:

RB>Но насколько мне казалось, функции strlen и strchr работают гораздо быстрее банальных переборов по одному символу.

RB>Насколько я понимаю, эти функции проверяют сразу четверки символов — оптимизатор не сможет сделать то же самое из обычного цикла "по символу".

Ах, мечты, мечты... Посимвольно.
Перекуём баги на фичи!
Re[6]: Функция обработки строки
От: Шахтер Интернет  
Дата: 24.05.04 18:24
Оценка: 41 (3) +1
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, rus blood, Вы писали:


RB>>Но насколько мне казалось, функции strlen и strchr работают гораздо быстрее банальных переборов по одному символу.

RB>>Насколько я понимаю, эти функции проверяют сразу четверки символов — оптимизатор не сможет сделать то же самое из обычного цикла "по символу".

К>Ах, мечты, мечты... Посимвольно.


Ни хрена подобного. Главный цикл выделен жирным.

        page    ,132
        title   strlen - return the length of a null-terminated string
;***
;strlen.asm - contains strlen() routine
;
;       Copyright (c) Microsoft Corporation. All rights reserved.
;
;Purpose:
;       strlen returns the length of a null-terminated string,
;       not including the null byte itself.
;
;*******************************************************************************

        .xlist
        include cruntime.inc
        .list

page
;***
;strlen - return the length of a null-terminated string
;
;Purpose:
;       Finds the length in bytes of the given string, not including
;       the final null character.
;
;       Algorithm:
;       int strlen (const char * str)
;       {
;           int length = 0;
;
;           while( *str++ )
;                   ++length;
;
;           return( length );
;       }
;
;Entry:
;       const char * str - string whose length is to be computed
;
;Exit:
;       EAX = length of the string "str", exclusive of the final null byte
;
;Uses:
;       EAX, ECX, EDX
;
;Exceptions:
;
;*******************************************************************************

        CODESEG

        public  strlen

strlen  proc

        .FPO    ( 0, 1, 0, 0, 0, 0 )

string  equ     [esp + 4]

        mov     ecx,string              ; ecx -> string
        test    ecx,3                   ; test if string is aligned on 32 bits
        je      short main_loop

str_misaligned:
        ; simple byte loop until string is aligned
        mov     al,byte ptr [ecx]
        add     ecx,1
        test    al,al
        je      short byte_3
        test    ecx,3
        jne     short str_misaligned

        add     eax,dword ptr 0         ; 5 byte nop to align label below

        align   16                      ; should be redundant

main_loop:
        mov     eax,dword ptr [ecx]     ; read 4 bytes
        mov     edx,7efefeffh
        add     edx,eax
        xor     eax,-1
        xor     eax,edx
        add     ecx,4
        test    eax,81010100h
        je      short main_loop
        ; found zero byte in the loop
        mov     eax,[ecx - 4]
        test    al,al                   ; is it byte 0
        je      short byte_0
        test    ah,ah                   ; is it byte 1
        je      short byte_1
        test    eax,00ff0000h           ; is it byte 2
        je      short byte_2
        test    eax,0ff000000h          ; is it byte 3
        je      short byte_3
        jmp     short main_loop         ; taken if bits 24-30 are clear and bit
                                        ; 31 is set

byte_3:
        lea     eax,[ecx - 1]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_2:
        lea     eax,[ecx - 2]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_1:
        lea     eax,[ecx - 3]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_0:
        lea     eax,[ecx - 4]
        mov     ecx,string
        sub     eax,ecx
        ret

strlen  endp

        end
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: Функция обработки строки
От: sva1509  
Дата: 24.05.04 18:37
Оценка:
Здравствуйте, rus blood, Вы писали:

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

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

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

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

Браво rus blood а то я уж думал тут вообще C незнают.
Когда читал тему чуть с кресла не свалился.
конечноже:
char *st1;

st1=strchr(str+pos,' ');

Работа в C без указателей не мыслима !
Re[7]: Функция обработки строки
От: Кодт Россия  
Дата: 24.05.04 21:47
Оценка: :)
Здравствуйте, Шахтер, Вы писали:

Ш>Ни хрена подобного. Главный цикл выделен жирным.


Поллитру мне, поллитру! Буду курить эту формулу...
do
{
  a1 = *s
  d1 = 0x7EFEFEFF;
  d2 = d1 + a1;
  a2 = ~a1;
  a3 = a2 ^ d2; // = ~a1 ^ (a1 + 7EFEFEFF)
}
while((a3 & 81010100) == 0);

если я всё правильно переписал...
Осталось разобраться.
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
Re[4]: Функция обработки строки
От: Кодт Россия  
Дата: 25.05.04 06:42
Оценка:
Здравствуйте, sva1509, Вы писали:

S>Браво rus blood а то я уж думал тут вообще C незнают.

S>Когда читал тему чуть с кресла не свалился.
S>конечноже:
S>char *st1;

S>st1=strchr(str+pos,' ');

Ты бы не только тему, но и всю дискуссию прочёл. Не "конечноже". Где контроль длины строки в твоём коде?
Перекуём баги на фичи!
Re[8]: Функция обработки строки
От: rus blood Россия  
Дата: 25.05.04 07:22
Оценка:
К>Поллитру мне, поллитру! Буду курить эту формулу...
К>
К>do
К>{
К>  a1 = *s
К>  d1 = 0x7EFEFEFF;
К>  d2 = d1 + a1;
К>  a2 = ~a1;
К>  a3 = a2 ^ d2; // = ~a1 ^ (a1 + 7EFEFEFF)
К>}
К>while((a3 & 81010100) == 0);
К>

К>если я всё правильно переписал...
К>Осталось разобраться.

Сие есть некое магическое шаманство (если ты конечно правильно перевел с asm), который "определяет" наличие нулевого байта в четверке... После нахождения такой четверки код функции просто линейно перебирает в нем байты по одному.

Я так понимаю, 64-разрядная версия будет работать еще быстрее.
Имею скафандр — готов путешествовать!
Re[5]: Функция обработки строки
От: rus blood Россия  
Дата: 25.05.04 07:24
Оценка:
S>>st1=strchr(str+pos,' ');
К>[/c]
К>Ты бы не только тему, но и всю дискуссию прочёл. Не "конечноже". Где контроль длины строки в твоём коде?


Сдается мне, что споры о проверке параметра pos не имеют смысла. Я так сильно подозреваю, что исходная задача состоит в том, чтобы перебрать все пробелы в некоем тексте, начиная, ессно, с начала. Посему, параметр pos, скорее всего, на самом деле вообще не нужен.
Имею скафандр — готов путешествовать!
Re[4]: Функция обработки строки
От: Lorenzo_LAMAS  
Дата: 25.05.04 09:39
Оценка:
J>а ты полюбопытствуй в Стандарте

А я и так подозреваю, что это беззнаковый тип.
Of course, the code must be complete enough to compile and link.
Re[5]: Функция обработки строки
От: jazzer Россия Skype: enerjazzer
Дата: 25.05.04 09:51
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

J>>а ты полюбопытствуй в Стандарте :)


L_L>А я и так подозреваю, что это беззнаковый тип.


тогда полюбопытствуй еще там же, что такое npos :)

чтобы не тратить твое время:
namespace std {
  template<class charT, class traits = char_traits<charT>,
  class Allocator = allocator<charT> >
  class basic_string {
  public:
     typedef typename Allocator::size_type size_type;
     static const size_type npos = -1;
  .....
  };


Так что возвращать -1 — вполне легально.

P.S. ZmaximI же не указал, какого типа ему нужен результат :)
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[6]: Функция обработки строки
От: jazzer Россия Skype: enerjazzer
Дата: 25.05.04 09:56
Оценка:
Здравствуйте, rus blood, Вы писали:


S>>>st1=strchr(str+pos,' ');

К>>[/c]
К>>Ты бы не только тему, но и всю дискуссию прочёл. Не "конечноже". Где контроль длины строки в твоём коде?


RB>Сдается мне, что споры о проверке параметра pos не имеют смысла. Я так сильно подозреваю, что исходная задача состоит в том, чтобы перебрать все пробелы в некоем тексте, начиная, ессно, с начала. Посему, параметр pos, скорее всего, на самом деле вообще не нужен.


и как же ты собираешься перебирать следующие после первого найденного пробелы?
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[7]: Функция обработки строки
От: rus blood Россия  
Дата: 25.05.04 10:03
Оценка:
J>и как же ты собираешься перебирать следующие после первого найденного пробелы?

Используя номер позиции уже найденного.
Имею скафандр — готов путешествовать!
Re[5]: Функция обработки строки
От: jazzer Россия Skype: enerjazzer
Дата: 26.05.04 08:12
Оценка: +1
Здравствуйте, Vamp, Вы писали:

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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.