按单个字符比较两个字符串 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++的主要内容,如果未能解决你的问题,请参考以下文章