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

Posted

技术标签:

【中文标题】C++中两个字符串的比较【英文标题】:Comparison of two strings in C++ 【发布时间】:2013-09-19 19:50:51 【问题描述】:

当我尝试在 C++ 中比较两个字符串时(一个从文件中读取,另一个分配了一个值),我得到一个不正确的输出:

ifstream pgmFile;
pgmFile.open(fileName);
string temp;
string comp = "P5";


for(int i = 0; i < 2; i++)


    pgmFile >> noskipws >> temp;
    cout << temp;



if(temp == comp)

else
    cout << "File does not contain 'P5'.  Please provide the correct type of file." << endl;

理论上这应该返回“true”这两个字符串是正确的。 temp = "P5" 的输出,所以我不明白为什么每次都会遇到我的 else 情况。非常感谢任何帮助!

【问题讨论】:

确认temp 确实包含“P5”而不是“P5”。看看这是否能提供任何见解:cout &lt;&lt; '|' &lt;&lt; temp &lt;&lt; '|' &lt;&lt; temp.size(); 你的温度是多少?看起来你阅读了 nonskipws istream 两次,而你的 temp 是你第二次阅读的内容。 【参考方案1】:

这很可能是因为您将值读入 temp 两次(在您的第一个 for 循环中)。第二次读取空字符串(例如,状态应该是 EOF)。当您打印一个空字符串时,您看不到它。然后,你比较''和'P5',这两个东西不一样。

您可以在“for”循环之后移动打印语句以查看它的值,这就是与“P5”比较的值。

希望对您有所帮助。祝你好运!

【讨论】:

如果我有任何代表,我会投票给你。这正是正在发生的事情。我将“readin”更改为“getline”,这样我就不会覆盖我的字符串。非常感谢!【参考方案2】:

noskipws 会将空白字符('\r'、'\n'、'\t' 等)加载到字符串中。如果您检查temp 的长度,它可能与comp 的长度不同,因为末尾有空格(如果我不得不猜测,我会说它可能是换行符)。

编辑:我忽略了循环 - 你不需要,第二次读取可能会设置 pgmFile.bad 标志(因为如果“P5”是所有内容,第一次读取将读取整个文件它)。

【讨论】:

【参考方案3】:

似乎 std::string 的某些实现有一个 operator==() 可以成功比较,但这不是通用的,如 std::string reference 所示。

如果您的环境是这种情况,则以下适用:

这取决于您要测试的内容是否相等。 temp 和 comp 是不同的字符串,因此在内存中具有不同的地址。简而言之,它们在这个意义上是不平等的。

您需要做的是比较字符串中的字符。 String 有一个 compare() 函数来执行此操作,它将根据相关字符串返回 -1、0 或 1。

【讨论】:

抱歉,您正在考虑使用 Java。 C++ 有一个非常有用的 operator==() 可以比较 2 个字符串。 “你需要做的是比较字符串中的字符”...这正是string::operator=所做的。 我想你会发现 string::operator== 不是通用的。请参阅cplusplus.com/reference/string/string,其中不包括该运算符声明。 @Ptolemy 你应该看看en.cppreference.com/w/cpp/string/basic_string 并非总是如此。称我为老手,但当我以 C++ stl 代码为生时,在 std::string 上执行 == 是一个错误。

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

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

降低在 C++ 中比较单个字符串中的两个字符的时间复杂度 [关闭]

如何在 C++ 中比较两个结构字符串

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

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

在 C++ 中比较两个 std::string 时的未定义行为 [关闭]