2012-01-14 5 views
3

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

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

... но с строковым объектом C++. Say 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"; 

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

ответ

3

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

+2

И если вы проверили проверку потока, вы уже поймали его! –

3

Никогда не используйте 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 S в петли, если вы хотите, чтобы продолжить чтение.

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

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

Смежные вопросы