1 Востаннє редагувалося shonrens (05.11.2015 11:15:58)

Тема: Стрінг, перевірка речення через цикл по елементу

Доброго дня. Хочу запитати як за допомогою стрінг можна перевірити чи в елемнті знаходиться один із символів.
Наприклад:
Є в мене if (I==/*!?.*/) де I це елемент який я хочу перевірити чи він співпадає з одним із символів.

2

Re: Стрінг, перевірка речення через цикл по елементу

1) якщо той стрінг - це все ж таки char
http://www.cplusplus.com/reference/cstring/strpbrk/

2) якщо то таки стрінг, і потрібно таки через цикл, то спочатку варто на папері продумати алгоритм, це дуже просто.

Мій блог про ОС сімейства *nix - http://nixtravelling.blogspot.com/
Подякували: shonrens1

3 Востаннє редагувалося Itari (05.11.2015 12:27:41)

Re: Стрінг, перевірка речення через цикл по елементу

Якщо класичними функціями то

if(strchr("/*!?.",I)) такий з І символ співпадае з маскою

Якщо через string

string s="/*!?.";
if(s.find(I)==std::string::npos)  такий з І символ співпадае з маскою

підійде?

Подякували: shonrens1

4 Востаннє редагувалося koala (05.11.2015 12:45:38)

Re: Стрінг, перевірка речення через цикл по елементу

Не транскрибуйте ідентифікатори. "Стрінг" - це може бути std::string (STL), System::String (C++/CLI) чи C++Builder-івський VCL-ний String, що є синонімом AnsiString чи WideString, залежно від версії. Вже не кажу про char[], QString, CString і т.ін., які теж можна за бажання стрінгами назвати. Те, що ви формулюєте "за допомогою стрінг", тільки все заплутує - вам же треба порівняти ваш символ (чи ні? тип I не вказаний) із множиною символів, то чому саме за допомогою "стрінг"? Якщо ви знаєте спосіб, то чому про нього питаєте? Якщо ні - то чому пропонуєте засіб? Виглядає як "допоможіть закріпити деталь за допомогою молотка" - звісно, можливо, там молоток потрібен, але раптом викрутка?
Потім - вам, мабуть, треба не "перевірити чи в елемнті знаходиться один із символів", а зробити щось більше, для чого ви обрали саме такий спосіб. Не факт, що найкращий, але оскільки ми не знаємо, що саме ви робите, то й підказати не можемо.
Якщо просто брати std::string і char I і шукати, чи не входить I в набір символів зі string, то остання порада Itari - те, що вам треба. Якщо ж треба знайти, чи в одному рядку є символи з іншого, то для char [] відповідь вказав Master_Sergius, а для std::string є find_first_of:

if(mystring.find_first_of("/*!?.")==std::string::npos){...
Подякували: shonrens, Master_Sergius2

5 Востаннє редагувалося shonrens (05.11.2015 18:28:53)

Re: Стрінг, перевірка речення через цикл по елементу

Хочу подякувати за підказки, вони мені допомогли, хотів зробити через спосіб який показав Itari, можливо щось не так зробив і не зовсім розуюмію як працює сам код рядок 21.

/*(1) Дано текст, що складається з кількох речень. Речення можуть закінчуватися знаками ‘.’, ‘?’,’!’. Порахувати кількість речень у тексті.*/
#include <iostream>
#include <string>
using namespace std;

int main ()
{

        string str; // створюю зміну типу стрінг
        cout << "Enter string:\n:";
        getline(cin, str); //заповнюю string
        cout << "Your string: " << str << endl;//показую 

        int counter = 0;//лічильник який рахує речення
        string symb = "/*!?."; //зміна яка тримає значення для перевірки

        int pos = str.find_first_of(symb);//в pos записую індекс в якому знайдено символ
        if(pos != string::npos){//перевіряю чи символ знайдений якщо знайдений
        counter++; //збільшую лічильник на один 
        while(pos < str.size()){//цикл крутиться від позиції до розміру рядка
                while(symb.find(str.at(pos) != string::npos))//ось цей код не зовсім розумію
                        pos++;//перевіряю наступний індекс

                pos = str.find_first_of(symb);//шукаю позицію з наступним символом /*!?.
                if (pos != string::npos)//якщо знайдений
                counter++; pos ++;//збільшую лічильник на 1 і позицію
        }
        }
        else
                counter++;


        cout << "Quantity sentences: " << counter << endl;
return 0;
}

6

Re: Стрінг, перевірка речення через цикл по елементу

Рядки 25-26 зовсім неочевидно працюють. Ви точно це мали на увазі?

                if (pos != string::npos)//якщо знайдений
                counter++; pos ++;//збільшую лічильник на 1 і позицію

7 Востаннє редагувалося shonrens (05.11.2015 18:54:32)

Re: Стрінг, перевірка речення через цикл по елементу

koala написав:

Рядки 25-26 зовсім неочевидно працюють. Ви точно це мали на увазі?

                if (pos != string::npos)//якщо знайдений
                counter++; pos ++;//збільшую лічильник на 1 і позицію

якщо я правильно розумію:
string::npos  вказує на велике число
якщо pos буде не знайдено воно буде дорівнювати цьому числу, якщо знайдено я збільшую позицію і лічильник.

8

Re: Стрінг, перевірка речення через цикл по елементу

symb.find(str.at(pos) != string::npos)

Це що це за таке?

Як звучить твое завдання? Розділити текст на массив речень? Чи що?

9 Востаннє редагувалося shonrens (05.11.2015 19:01:03)

Re: Стрінг, перевірка речення через цикл по елементу

Itari написав:

symb.find(str.at(pos) != string::npos)

Це що це за таке?

Як звучить твое завдання? Розділити текст на массив речень? Чи що?

Ні
/*(1) Дано текст, що складається з кількох речень. Речення можуть закінчуватися знаками ‘.’, ‘?’,’!’. Порахувати кількість речень у тексті.*/
я хочу зробити перевірку на "!!!" "! " і т.д. чи це зайве?

10

Re: Стрінг, перевірка речення через цикл по елементу

shonrens написав:
koala написав:

Рядки 25-26 зовсім неочевидно працюють. Ви точно це мали на увазі?

                if (pos != string::npos)//якщо знайдений
                counter++; pos ++;//збільшую лічильник на 1 і позицію

якщо я правильно розумію:
string::npos  вказує на велике число
якщо pos буде не знайдено воно буде дорівнювати цьому числу, якщо знайдено я збільшую позицію і лічильник.

А позиція збільшується в будь-якому разі, не так, як ви пишете.

11 Востаннє редагувалося shonrens (05.11.2015 19:37:38)

Re: Стрінг, перевірка речення через цикл по елементу

koala написав:
shonrens написав:
koala написав:

Рядки 25-26 зовсім неочевидно працюють. Ви точно це мали на увазі?

                if (pos != string::npos)//якщо знайдений
                counter++; pos ++;//збільшую лічильник на 1 і позицію

якщо я правильно розумію:
string::npos  вказує на велике число
якщо pos буде не знайдено воно буде дорівнювати цьому числу, якщо знайдено я збільшую позицію і лічильник.

А позиція збільшується в будь-якому разі, не так, як ви пишете.

Тобто pos можна не збільшувати він сам збільшується?
Наприклад я маю код int pos = str.find_first_of(symb);
якщо я ще раз його введу int pos = str.find_first_of(symb);
то позиція зміниться?

12

Re: Стрінг, перевірка речення через цикл по елементу

я хочу зробити перевірку на "!!!" "! " і т.д. чи це зайве?

Тоді тобі потрібно шукати символ з пробілом а не лише символ.
В такому разі я б мабудь робив так:

string s="...",mask="!?."; 
int cnt=0;
for(int i=0;i<s.length()-1;i++){
 if(mask.find(s[i])!=string::npos && s[i+1]==' ') {cnt++; i++;};
}
Подякували: shonrens1

13 Востаннє редагувалося koala (05.11.2015 20:47:50)

Re: Стрінг, перевірка речення через цикл по елементу

shonrens написав:
koala написав:
shonrens написав:

якщо я правильно розумію:
string::npos  вказує на велике число
якщо pos буде не знайдено воно буде дорівнювати цьому числу, якщо знайдено я збільшую позицію і лічильник.

А позиція збільшується в будь-якому разі, не так, як ви пишете.

Тобто pos можна не збільшувати він сам збільшується?
Наприклад я маю код int pos = str.find_first_of(symb);
якщо я ще раз його введу int pos = str.find_first_of(symb);
то позиція зміниться?

Ні. Вирази "counter++;" та "pos ++;" знаходяться в різних блоках, і цілком можливо, що перше не виконується, а друге - виконується.

Подякували: shonrens1

14

Re: Стрінг, перевірка речення через цикл по елементу

koala написав:
shonrens написав:
koala написав:

А позиція збільшується в будь-якому разі, не так, як ви пишете.

Тобто pos можна не збільшувати він сам збільшується?
Наприклад я маю код int pos = str.find_first_of(symb);
якщо я ще раз його введу int pos = str.find_first_of(symb);
то позиція зміниться?

Ні. Вирази "counter++;" та "pos ++;" знаходяться в різних блоках, і цілком можливо, що перше не виконується, а друге - виконується.

зрозумів бракує {} дякую

15

Re: Стрінг, перевірка речення через цикл по елементу

На майбутнє. Щоб уникнути такої помилки:
- завжди ставте фігурні дужки після if, for,while;
- не об'єднуйте два вирази в один рядок;
- робіть відступи.
Витрати часу на це значно менші, ніж витрати часу на пошук незрозумілої помилки внаслідок такого стилю оформлення.

Подякували: shonrens1

16 Востаннє редагувалося shonrens (05.11.2015 22:21:13)

Re: Стрінг, перевірка речення через цикл по елементу

Хлопці я трохи не так умову задачі зрозумів :[
ось так її зробив, всім хто був не байдужий дуже дякую)

/*(1) Дано текст, що складається з кількох речень. Речення можуть закінчуватися знаками ‘.’, ‘?’,’!’. Порахувати кількість речень у тексті.*/
#include <iostream>
#include <string>
using namespace std;

int main ()
{

        string str ("Behind every man now alive stand thirty ghosts, for that is the ratio by which the dead outnumber the living! Since the dawn of time, roughly a hundred billion human beings have walked the planet Earth. What?"); // створюю зміну типу стрінг
        cout << str << endl;

        int counter = 0;//лічильник який рахує речення
        string symb = "!?."; //зміна яка тримає значення для перевірки

        int pos = str.find_first_of(symb);//в pos записую індекс в якому знайдено символ
        if(pos != string::npos){//перевіряю чи символ знайдений якщо знайдений
        while(pos != string::npos){//цикл крутиться від позиції до розміру рядка
                pos = str.find_first_of(symb, pos + 1);
                counter++;
        }
        }
        else
                counter++;


        cout << "Quantity sentences: " << counter << endl;
return 0;
}

Тільки от що не зрозумів чому мій cоunter = 3
виходить я знайшов
перший раз символ ! counter++  (0),
Потім знайшов "."  counter++ (1)
Потім знаходжу ? і counter++ (2)

17

Re: Стрінг, перевірка речення через цикл по елементу

Взагалі-то ви не з -1 починаєте, а з 0.

18

Re: Стрінг, перевірка речення через цикл по елементу

koala написав:

Взагалі-то ви не з -1 починаєте, а з 0.

int counter = 0; так з 0 але чому мені рахує 3 в кінці

19

Re: Стрінг, перевірка речення через цикл по елементу

А у вашій математиці, якщо 0 три рази збільшити на 1, має виходити щось інше, крім 3? Розкажіть детальніше.

20 Востаннє редагувалося shonrens (05.11.2015 23:13:12)

Re: Стрінг, перевірка речення через цикл по елементу

koala написав:

А у вашій математиці, якщо 0 три рази збільшити на 1, має виходити щось інше, крім 3? Розкажіть детальніше.

перший раз символ ! counter++  (0),
Потім знайшов "."  counter++ (1)
Потім знаходжу ? і counter++ (2)
трохи не так написав я мав на увазі так
counter = 0 перший раз символ !
Потім знайшов "."  counter++ (1)
Потім знаходжу ? і counter++ (2)

я так бачу як мій лічильник рахує.