Форум программистов, компьютерный форум CyberForum.ru

string::npos задать корректное условие - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.72
AnreyKazakov
Заблокирован
26.09.2012, 23:57     string::npos задать корректное условие #1
Задача - разбить введеную строку на слова и забить в лист... у меня она решена конечно, но некрасиво, а этот вариант чет не канает....
C++
1
2
3
4
5
6
7
string line;
list<string> all;
string::size_type k=0;
while(getline(cin,line)){
    do{all.push_back(line.substr(k,(line.find(" ",k)==string::npos?line.size()-k:line.find(" ",k)-k)));
            }while(string::npos!=(k=line.find(" ",k))++);
        }
Вот....
Кусок кода, он зацикливается до бесконечности, подозреваю ошибка в условии Но, понять где не могу.... =(

Добавлено через 1 минуту
При чем внутри цикла он нормально находит npos и выводит корректно а в условии нет =(
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2012, 23:57     string::npos задать корректное условие
Посмотрите здесь:

Как задать правильно условие??? C++
C++ как задать условие?
C++ задать условие if
Как задать обратное условие в if C++
string::npos C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
27.09.2012, 00:12     string::npos задать корректное условие #2
Написал тут свой велоиспед, можно красивше, но тогда будет менее понятно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include <list>
using namespace std;
 
int main()
{
    string str="String ,   !! with ?? text.";
    list<string> words;
    string toFind=" ,.;!?[]1234567890";
    size_t startPos=str.find_first_not_of(toFind);
    size_t endPos=str.find_first_of(toFind,startPos+1);
    if(startPos!=string::npos && endPos==string::npos)//видимо только одно слово
        words.push_back(str);
    while(startPos!=string::npos && endPos!=string::npos)
    {
        words.push_back(str.substr(startPos,endPos-startPos));
        startPos=str.find_first_not_of(toFind,endPos+1);
        endPos=str.find_first_of(toFind,startPos+1);
    }
    list<string>::iterator it=words.begin();
    while(it!=words.end())
        cout<<*it++<<endl;
}
AnreyKazakov
Заблокирован
27.09.2012, 11:20  [ТС]     string::npos задать корректное условие #3
Этот велосипед не в ту сторону едет

Добавлено через 9 часов 13 минут
Ну помогите кто-нибудь, пожалуйста, почему условие не пашет? Вот, код полностью, если посмотрите в условии wile почему-то неравенство пропускает, а потом тут же в начале след итерации пишет что верно (сравнив k и конец find'а - string::npos , я уже проверок кучу строк затолкал , результата 0, бьюсь уже неск часов =(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>
#include <iterator>
#include <list>
#include <utility>
#include <map>
using std::cout; using std::cin; using std::endl;using std::string;using std::getline;
using std::list; using std::iterator; using std::pair; using std::map;
int main(){
    string line;
    list<string> all;
    string::size_type k=-1;
    string x;
    while(getline(cin,line)){
        do{
        cout<<"позиция    k: "<<k<<" "<<endl;
        cout<<"символ конца: "<<string::npos<<" ";          
        if(k==string::npos)cout<<" +++++ k и символ конца равны";cout<<endl;
        ++k;
        all.push_back(line.substr(k,(line.find(" ",k)==string::npos?line.size()-k:line.find(" ",k)-k)));
        cout<<"позиция k+1: "<<k<<" "<<endl;
        cout<<"количество символов в слове(/0 /n): "<<(line.find(" ",k)==string::npos?line.size()-k:(line.find(" ",k)-k));
        cout<<endl<<"приращение k=line.find(\" \",k))"<<endl;
        cin>>x;
        }while((k=line.find(" ",k))!=string::npos);
        }
    cout<<endl; 
    for(list<string>::iterator ix=all.begin();ix!=all.end();++ix)cout<<*ix<<endl;
    return 0;
    }
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
27.09.2012, 11:25     string::npos задать корректное условие #4
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Этот велосипед не в ту сторону едет
Почему же? Вас просили слова повыделять и затолкать в лист, это и делает мой код
В вашем коде просто желания нет разбираться так как там чёрт ногу сломит.
C++
1
 all.push_back(line.substr(k,(line.find(" ",k)==string::npos?line.size()-k:line.find(" ",k)-k)));
Не, я понимаю что это прочитать вполне реально, но ох как не хочеться разбираться зачем это было сделано и что будет дальше

Не по теме:

ну и судя по количеству сообщений не хочеться разбираться не только мне ...

Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
27.09.2012, 11:47     string::npos задать корректное условие #5
У меня данный код работает на ура:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <list>
#include <string>
#include <iostream>
#include <iterator>
#include <algorithm>
 
using namespace std;
 
int main(int argc, char** argv) {
    string line;
    list<string> all;
    string::size_type k = 0;
    string::size_type nextWS = 0;
    while(getline(cin, line)){
        do{
            nextWS = line.find(" ", k);
            string subs = line.substr(k, 
                (nextWS == string::npos ? line.size() - k : nextWS - k));
            if (!subs.empty())
                all.push_back(subs);
            k = nextWS;
        }while(string::npos != k++);
    }
    
    cout<<"Words:\n";
    copy(all.begin(), all.end(), ostream_iterator<string>(cout, "\n"));
    return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.09.2012, 12:22     string::npos задать корректное условие #6
AnreyKazakov, Почему stringstream не используешь?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <list>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <iostream>
 
int main()
{
    const std::string s = "hello and what do you want now";
    std::stringstream ss(s);
    std::list<std::string> words((std::istream_iterator<std::string>(ss)), std::istream_iterator<std::string>());
    std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}
AnreyKazakov
Заблокирован
27.09.2012, 14:43  [ТС]     string::npos задать корректное условие #7
Да еперный театр, я просто понять не могу почему не пашет, что блин задача сложная чтоли, я и сам могу написать 100500 решений разных, а тут не прет и все .... что-то именно в условии, можно код из центра ваабшэ убрать в первом варианте, пустой оставить, а условие выхода почему-то не пашет. Как я только над ним не извращался, не хочет и все =(
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.09.2012, 14:51     string::npos задать корректное условие #8
AnreyKazakov, Зачем удалять гланды через задницу?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string>
#include <list>
#include <iostream>
 
int main()
{
   using namespace std;
string line;
list<string> all;
string::size_type k=0;
while(getline(cin,line)){
    do{all.push_back(line.substr(k,(line.find(" ",k)==string::npos?line.size()-k:line.find(" ",k)-k)));
      }while(string::npos!=(k=line.find(" ",k))++);
    cout << "processed" << std::endl;
}
}
У меня все работает. Входные данные пожалуйста скажите. Пишет ли processed? Для того, чтобы закончить первый цикл нужно послать EOF.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2012, 15:07     string::npos задать корректное условие
Еще ссылки по теме:

size_t и npos C++
Как правильно задать условие? C++
Правильно задать условие в цикле C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
AnreyKazakov
Заблокирован
27.09.2012, 15:07  [ТС]     string::npos задать корректное условие #9
Аху... тфу, афигеть, кароче скопировал код в другой main и все поперло, КАК ТАК?
Второй раз уже такое вижу, один раз экзамен сдавал, задачи повышенной трудн на паскале, там капец четырехэтажное какое-то вычисление, ну я ВСЕ проверил раз 10 не прет, ушла куча времени, потом переписал заново, все точно так же, не поверите ни одного отличия в задачах, одна прет а у второй ошибка какая-то вылетает, я в той которая не шла все буквы 100% на латинские поменял и все равно не шла, мистика да и только... Я доволен , все пошло Всем спасибо за ответы =)

Добавлено через 11 минут
Цитата Сообщение от ForEveR Посмотреть сообщение
Почему stringstream не используешь
Я еще пока не знаю что это , с месяц где-то на С++ =)
Yandex
Объявления
27.09.2012, 15:07     string::npos задать корректное условие
Ответ Создать тему
Опции темы

Текущее время: 01:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru