我有这个:
#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中相同的内容也无关紧要。
答案 0 :(得分:3)
使用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";
}
答案 1 :(得分:3)
您没有正确比较这两个字符串,您正在比较两个字符串数组的地址。
你必须使用strcmp函数。
while(strcmp(str1,str2)!=0)
或者使用std :: string类,它允许你使用重载的运算符==来比较字符串。
答案 2 :(得分:2)
str1和str2是char数组,这实际上意味着它们是char数组的指针。他们的价值观是不变的,永远不会是平等的。将声明替换为:
string str1 = "abc123";
string str2 = "abc123";
你会得到更好的结果。 (但需要标题)
答案 3 :(得分:0)
您正在比较指针。
请使用strcmp
。
此外,使用cin
是不安全的,因为左边可能太小了。
修改为
} while(strcmp(str1, str2))
答案 4 :(得分:-1)
在分配两个数组的主函数堆栈框架中:
两个数组得到两个不同的固定地址,永远不会改变!
即使每次都改变数组的内容!
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以及
因此循环条件始终为真。