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 << '|' << temp << '|' << 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++ 中比较单个字符串中的两个字符的时间复杂度 [关闭]