Поиск строк в строке в C ++ - PullRequest
3 голосов
/ 14 января 2012

все.Я опытный программист на C, пытающийся приспособиться к C ++.Я хотел бы сделать эквивалент этого оператора C ...

sscanf(str, "%s %s", sub1, sub2);

... но со строковым объектом C ++.Скажем, что str это "hello world", выполнение приведенного выше оператора sscanf поместит "hello" в sub1, а "world" в sub2.Я знаю, что могу использовать такие функции C в C ++, но я бы хотел использовать строковый объект C ++ вместо массива символов.Я пробовал это:

string q, h, w;
cout << "Type \"hello world\": ";
cin >> q;
istringstream x(q);
x >> h >> w;
if (h == "hello")
    cout << "Yes!\n";
else
    cout << "No!\n";
if (w == "world")
    cout << "Yes!\n";
else
    cout << "No!\n";

Но он выдает «Да! Нет!», Что означает, что он принял «привет», но не «мир».Есть идеи?

Ответы [ 2 ]

3 голосов
/ 14 января 2012

Никогда не используйте iostreams без проверки ошибок.Как говорит Джейсон, прочитайте всю строку, а не только один токен, но даже тогда проверяйте наличие ошибок:

std::string line;

if (std::getline(std::cin, line))
{
    std::string h, w;
    std::istringstream iss(line);

    if (iss >> h >> w)
    {
        // success
    }
    else
    {
        std::cerr << "Error reading your input.\n";
    }
}
else
{
    std::cerr << "Error reading from stdin!\n";
}

Вы можете превратить if в циклы, если хотите продолжить чтение.

По сути, вы можете проверить каждое отформатированное извлечение (getline, >>) как условие, поскольку результат может быть преобразован во что-то проверяемое, и условие будет false, если операция не удалась.Следовательно, вы никогда не должны интерпретировать предполагаемые переменные получателя, если операция не была выполнена успешно!

Если бы вы добавили эту проверку к своему коду x >> h >> w;, вы бы никогда не прошли эту строку без ошибок.

3 голосов
/ 14 января 2012

Это потому, что operator>>, используемый с cin, захватит только фразу "привет" и остановится на первом разделителе (в данном случае пробел).Если вы хотите захватить всю строку ввода до первого разделителя строки, введенного пользователем, вам придется использовать getline(cin, q).Версия с двумя аргументами getline() использует символ новой строки в качестве разделителя, но есть версия с тремя аргументами, которая также позволяет указывать пользовательский символ разделителя строк.

...