сравнить две строки по отдельным символам C ++

Работа над программой, которая сравнивает аргумент с текстом в файле (мой файл - словарь, содержащий много английских слов).

Сейчас приложение работает только полностью совпадающие строки.

Хотел узнать, есть ли способ сравнить введенную частичную строку с полной строкой в ​​файле и получить совпадение. Например, если аргумент ap, он будет соответствовать Apple, application alliance ext.

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


int main ( int argc, char *argv[] ) {

    ifstream inFile;
    inFile.open("/Users/mikelucci/Desktop/american-english-insane");

    //Check for error

    if (inFile.fail()) {
        cerr << "Fail to Open File" << endl;
        exit(1);
    }

    string word;
    int count = 0;


    //Use loop to read through file until the end

    while (!inFile.eof()) {
        inFile >> word;
        if (word == argv[1]) {
            count++;
        }
    }

    cout << count << " words matched." << endl;

    inFile.close(); 
    return 0;
}

person Mikey Lucci    schedule 10.12.2016    source источник
comment
ap должен совпадать с alliance? Тогда просто сравните первые символы. В противном случае вот ваш дубликат. И эта eof вещь ... не делайте этого, а вместо этого погуглите, почему / что делать.   -  person LogicStuff    schedule 11.12.2016
comment
std :: string :: compare () или std :: regex - и не зацикливайтесь на eof () - см. latedev.wordpress.com/2012/12/04/all-about-eof, чтобы узнать, почему   -  person    schedule 11.12.2016
comment
Может быть, вы ищете сходство с помощью такого алгоритма, как линзштейн-расстояние? у Google есть ссылки   -  person    schedule 11.12.2016


Ответы (2)


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

word.find(argv[1]) != string::npos

Если под «совпадением» вы имеете в виду «строка из файла начинается со строки из ввода», то снова вы можете использовать string :: find, но со следующим условием:

word.find(argv[1]) == 0

Соответствующая документация находится здесь.

person Ardavel    schedule 10.12.2016

Начните с копирования argv[1] в строку (не обязательно, но это упрощает последующее сравнение):

std::string target(arg[1]);

Затем используйте std::equal:

if (std::equal(word.begin(), word.end(), target.begin(). target.end()))

Эта форма equal (добавлена ​​в C ++ 14) возвращает true, если более короткая из двух последовательностей совпадает с соответствующими символами в начале более длинной.

person Pete Becker    schedule 10.12.2016