C++ 中的永无止境循环,比较两个字符

Neverending loop in C++, that compares two char's

本文关键字:两个 字符 比较 永无止境 循环 C++      更新时间:2023-10-16

我有这个:

#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以及

因此循环条件一直变为真。