C++ 中的永无止境循环,比较两个字符
Neverending loop in C++, that compares two char's
我有这个:
#include <iostream>
#include <conio.h>
int main ()
{
char str1[] = "abc123";
char str2[] = "abc123";
do
{
std::cout << "String: ";
std::cin >> str2;
} while (str1 != str2);
std::cout << "str1 is equal to str2, press any key to quit.n";
_getch();
return 0;
}
当str1等于str2,并且str2是用户设置的值时,程序应该结束。问题是,即使我键入与str1相同的值,它也会保持循环,不管我是否放入与str1中相同的内容。
您没有正确比较这两个字符串,而是在比较两个char数组的地址。
您必须使用strcmp函数。
while(strcmp(str1,str2)!=0)
或者使用std::string类,它允许您使用重载运算符==来比较字符串。
使用std::string
而不是原始数组和指针,以避免诸如打开缓冲区溢出、比较指针而不是字符串等愚蠢的错误。
#include <iostream>
#include <string>
int main ()
{
std::string str1 = "abc123";
std::string str2 = "abc123";
do
{
std::cout << "String: ";
std::cin >> str2;
} while (str1 != str2);
std::cout << "str1 is equal to str2.n";
}
str1和str2是char数组,这实际上意味着它们是指向char数组的指针。它们的值是恒定的,永远不会相等。将声明替换为:
string str1 = "abc123";
string str2 = "abc123";
你会得到更好的结果。(但需要标题)
您正在比较指针。
请使用strcmp
。
此外,使用cin
是不安全的,因为左边可能太小。
修改为
} while(strcmp(str1, str2))
在分配两个数组时的主函数堆栈框架中:
这两个数组得到两个不同的固定地址,永远不会改变!
即使数组的内容每次都会更改!
char str1[] = "abc123"; // str1 gets an unique fixed address say 1000
char str2[] = "abc123"; // str2 gets an unique fixed address say 1007
因此,语句while (str1 != str2);
继续比较地址1000和1007以及
因此循环条件一直变为真。
相关文章:
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 在函数中连接两个字符,并在 C++ 中返回输出
- 舍入 QDecDouble 值,精度最多为两个字符
- 计算两个字符序列
- 在c++中连接两个字符
- 有没有办法我可以从 istringstream 中读取两个字符
- 如何查看两个字符变量是否相等
- 使用位于 C 字符串中的两个字符*获取子字符串
- 比较两个字符的问题
- 如何修复密码条目,它一次输入两个字符
- 字符串构造函数将两个字符* 放入另一个 std::string 在 C++14 中有效,但不适用于 C++17
- 将两个字符数组相互添加
- 在 c++ 中添加两个字符
- 如何删除QString的前两个字符
- 如何使用两个字符来控制 C++ 程序的流程
- 如何将两个字符或字符串数组附加到一个数组中
- 如何从两个字符之间的文件中提取整数
- 删除两个字符之间的文本
- std::setw() 将特殊字符视为两个字符
- 比较两个字符*是否相等