Уважаемые мастера, помогите пожалуйста, СРОЧНО нужна
функция NXT_BLNK(str,pos),которая анализирует строку
str, начиная с позиции pos, и возвращает номер первого найденого пробела.
Если пробела нет, то возвращает 0; если pos<0, то возвращается -1.
Здравствуйте, 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;
}
ZI>Уважаемые мастера, помогите пожалуйста, СРОЧНО нужна ZI>функция NXT_BLNK(str,pos),которая анализирует строку ZI>str, начиная с позиции pos, и возвращает номер первого найденого пробела. ZI>Если пробела нет, то возвращает 0; если pos<0, то возвращается -1.
Здравствуйте, 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;
}
Здравствуйте, 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;
}
Здравствуйте, ZmaximI, Вы писали:
ZI>Уважаемые мастера, помогите пожалуйста, СРОЧНО нужна ZI>функция NXT_BLNK(str,pos),которая анализирует строку ZI>str, начиная с позиции pos, и возвращает номер первого найденого пробела. ZI>Если пробела нет, то возвращает 0; если pos<0, то возвращается -1.
а если строка начинается с пробела и pos = 0??
тогда :
NXT_BLNK(" abc", 0) = 0
но по логике задачи это означает, что пробела нет.. неоднозначность
Здравствуйте, Тим, Вы писали:
Тим>Здравствуйте, Vamp, Вы писали:
V>>Приведенный код не решает поставленную задачу.
Тим>Согласен, проглядел, про, начиная с pos.
Тим>
Здравствуйте, 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;
// v1const char* t = strchr(s+p,' ');
if(!t) return -1;
return t-p;
// v2int n = strcspn(s+p," "); // удобно, если ищем не только пробел, но и, например, табуляциюif(s[n]==0) return -1;
return p+n;
}
Ну и получается, что сперва сбегали от начала до конца, а затем ещё раз — от позиции до следующего пробела.
Лишняя работа.