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

Comparison of two strings in C++

本文关键字:两个 字符串 比较 C++      更新时间:2023-10-16

当我尝试比较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两次(在第一个 for 循环中)。第二次读取空字符串时(例如,状态应为 EOF)。打印空字符串时,看不到它。然后,您将"与"P5"进行比较,这两件事是不一样的。

您可以将打印语句移到"for"循环之后以查看它包含的值,这将是与"P5"进行比较的值。

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

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

编辑:我掩盖了循环 - 你不需要,第二次读取可能会设置 pgmFile.bad 标志(因为如果"P5"是其中的全部内容,第一次读取会读取整个文件)。

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

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

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

您需要做的是比较字符串中的字符。字符串有一个 compare() 函数来执行此操作,它将返回 -1、0 或 1,具体取决于相对字符串。