Автозаполнение, без сомнения, полезный инструмент. Много раз при поиске чего-либо в Google я пишу первые несколько символов и позволяю ему завершить слово (а иногда и предложение) за меня.

В этой статье я опишу, как добавить автодополнение в ваше приложение на C++.

Предположим, у вас есть приложение, в котором вы хотите, чтобы пользователь ввел некоторый текст, и текст, который пользователь будет вводить, почти всегда будет частью набора слов или предложений, вы можете помочь пользователю, добавив автозаполнение, чтобы им просто нужно ввести первые несколько символов текста, и ваше приложение сделает это за них.

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

string DICTIONARY[] = {
 "alibaba",
 "alphabet",
 "amazon",
 "apple"
};

Мы начинаем со сбора данных, введенных пользователем, и сохраняем их в переменной:

int main(int argc, char** argv) {
 string input;
 
 cin >> input;
 
 return 0;
}

Далее выясняем, содержится ли введенный пользователем текст в словаре. Для этого мы пройдемся по элементам в словаре и для каждого проверим, содержит ли он введенный пользователем текст:

string getMatch(string text) {
 // returns the closest match in the DICTIONARY to text
 
 for (int i = 0; i < 4; i++) {
  if (contains(DICTIONARY[i], text)) {
   return DICTIONARY[i];
  }
 }
 
 return text;
}

Функция getMatch() просматривает словарь в поисках ближайшего подходящего элемента и возвращает его. Если ни один элемент не соответствует входному тексту, текст возвращается.

Чтобы проверить, содержит ли строка другую строку, мы используем функцию contains():

bool contains(string str1, string str2) {
 // returns true if str1 contains str2, else false
 
 return (str1.find(str2) != string::npos);
}

Где npos означает до конца строки, то есть, если str2 не имеет индекса в str1 до тех пор, пока не будет достигнут конец str1, то вернуть false.

Теперь мы можем получить это ближайшее совпадение в функции main() и вывести его в консоль:

int main(int argc, char** argv) {
 string input, closestMatch;
 
 cin >> input;
 
 closestMatch = getMatch(input);
 cout << closestMatch;
 
 return 0;
}

Вот некоторые результаты тестирования приложения:

Как мы видим, приложение правильно завершает ввод пользователя, если в словаре есть совпадение. Если совпадения нет, ввод остается нетронутым.

Спасибо, что дошли до этого места. Полный код этого проекта можно найти здесь. Если у вас есть какие-либо комментарии или вопросы, пожалуйста, оставьте их ниже.