按单个字符比较两个字符串 C++

Posted

技术标签:

【中文标题】按单个字符比较两个字符串 C++【英文标题】:compare two strings by individual characters C++ 【发布时间】:2016-12-10 23:13:42 【问题描述】:

正在开发一个将参数与文件中的文本进行比较的程序(我的文件是一个包含很多英文单词的字典)。

目前,应用程序仅在完全匹配的字符串中工作。

想知道是否有一种方法可以将输入的部分字符串与文件中的完整字符串进行比较并使其匹配。 例如,如果 arg 是 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;

【问题讨论】:

ap 应该与alliance 匹配吗?然后只比较第一个字符。否则,here 是您的副本。而那个eof 的事情......不要这样做,而是用谷歌搜索为什么/做什么。 std::string::compare() 或 std::regex - 不要在 eof() 上循环 - 请参阅 latedev.wordpress.com/2012/12/04/all-about-eof 了解原因 也许您正在通过像the lenshtein-distance 这样的算法来寻找相似之处? Google has links 【参考方案1】:

如果“匹配”是指“文件中的字符串包含输入中的字符串”,则可以使用 string::find 方法。在这种情况下,您的情况将如下所示:

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

如果“匹配”是指“文件中的字符串以输入中的字符串开头”,那么您可以再次使用 string::find,但条件如下:

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

相关文档为here。

【讨论】:

【参考方案2】:

首先将argv[1]复制到一个字符串中(并非绝对必要,但它使后续的比较更简单一些):

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

然后使用std::equal:

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

这种形式的equal(在 C++14 中添加)如果两个序列中较短的一个与较长的开头的相应字符匹配,则返回 true

【讨论】:

以上是关于按单个字符比较两个字符串 C++的主要内容,如果未能解决你的问题,请参考以下文章

一个时钟周期内的 C++ 字符串比较

请问C++中两个字符串的大小是怎样比较的?

C++中两个字符串的比较

C++入门经典-例6.21-比较string字符串,比较两个字符串

C++ , winapi 比较两个 WCHAR * 字符串

萌新笔记——C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)