Как использовать string::find()?

#c

#c

Вопрос:

Выведите «Censored», если пользовательский ввод содержит слово «проклятый», иначе выведите пользовательский ввод. Заканчивать новой строкой. Подсказка: find() возвращает string::npo, если искомый элемент не найден.

Примечание: Эти действия могут тестировать код с разными тестовыми значениями. В этом упражнении будут выполнены три теста, с пользовательским вводом «Этот чертов кот»., затем с «Черт возьми, это было страшно!», затем с «Я штопаю твои носки».

Вот код, который я пробовал. Я действительно не уверен, что еще попробовать.

 #include <iostream>
#include <string>
using namespace std;

int main() {
   string userInput;

   userInput = "That darn cat.";

   if (userInput.find("darn")) {
      cout << "Censored" << endl;
   }

   else {
      cout << userInput << endl; 
   }

   return 0;
}
  

userInput должно привести к, Censored если оно содержит "darn" . В противном случае он должен напечатать userInput .

Мои результаты говорят Censored для каждого ввода.

Комментарии:

1. Смотрите std::basic_string::find .

2. Текст вопроса сообщает вам, что вы пропустили — » find() возвращает string::npos , если искомый элемент не найден. » Вы не проверяете, против чего он возвращает string::npos .

Ответ №1:

Вы не следуете инструкциям, которые вам были даны.

В частности, вам не хватает кода для этих условий:

  • Подсказка: find() возвращает string::npo, если искомый элемент не найден.

    Вы не проверяете возвращаемое значение find() for npos (которое определяется как string::size_type(-1) ).

    find() возвращает числовое значение для индекса найденной подстроки или npos если она не найдена.

    Инструкция if (userInput.find("darn")) проверяет нулевое или ненулевое значение индекса. Во всех трех тестовых примерах find() не вернет индекс 0, поэтому любое ненулевое значение приведет к тому, что if оператор будет вычислен как true и "Censored" будет введен блок.

  • В этом упражнении будут выполнены три теста, с пользовательским вводом «Этот чертов кот»., затем с «Черт возьми, это было страшно!», затем с «Я штопаю твои носки».

    Вы выполняете только 1-й тест, но не остальные тесты.

Попробуйте это вместо:

 #include <iostream>
#include <string>
using namespace std;

int main() {
    string userInput;

    userInput = "That darn cat.";

    if (userInput.find("darn") != string::npos) {
        cout << "Censored" << endl;
    }
    else {
        cout << userInput << endl;
    }

    userInput = "Dang, that was scary!";

    if (userInput.find("darn") != string::npos) {
        cout << "Censored" << endl;
    }
    else {
        cout << userInput << endl;
    }

    userInput = "I'm darning your socks.";

    if (userInput.find("darn") != string::npos) {
        cout << "Censored" << endl;
    }
    else {
        cout << userInput << endl;
    }

    return 0;
}
  

Который затем может быть переписан с использованием повторно используемой функции:

 #include <iostream>
#include <string>
using namespace std;

void checkInput(const string amp;input) {
    if (input.find("darn") != string::npos) {
        cout << "Censored" << endl;
    }
    else {
        cout << input << endl;
    }
}

int main() {
    string userInput;

    userInput = "That darn cat.";
    checkInput(userInput);

    userInput = "Dang, that was scary!";
    checkInput(userInput);

    userInput = "I'm darning your socks.";
    checkInput(userInput);

    return 0;
}