c++ - 比较两个字符串的每个字符。新的和寻找输入

标签 c++ string string-comparison

我目前正在 WGU 上 C++ 开发类(class),我看到了一个基于 Simon Says 的练习。基本上,simonPattern是一个包含 10 个字符(R、G、B、Y)的字符串,并且 userInput将是游戏每一步的输入。本章在breakcontinue语句,但练习没有提供关于使用哪种语句的任何输入(ifwhilefor)。我尝试了几种不同的方法来编写它,但是本书练习中的编译器不再允许 #include陈述,我最终通过了以下内容:

#include <iostream>
#include <string>
using namespace std;

int main() {
   string simonPattern;
   string userPattern;
   int userScore = 0;
   int i = 0;

   userScore = 0;
   simonPattern = "RRGBRYYBGY";
   userPattern  = "RRGBBRYBGY";
   char simonPattern0 = simonPattern[0];
   char simonPattern1 = simonPattern[1];
   char simonPattern2 = simonPattern[2];
   char simonPattern3 = simonPattern[3];
   char simonPattern4 = simonPattern[4];
   char simonPattern5 = simonPattern[5];
   char simonPattern6 = simonPattern[6];
   char simonPattern7 = simonPattern[7];
   char simonPattern8 = simonPattern[8];
   char simonPattern9 = simonPattern[9];
   char userPattern0 = userPattern[0];
   char userPattern1 = userPattern[1];
   char userPattern2 = userPattern[2];
   char userPattern3 = userPattern[3];
   char userPattern4 = userPattern[4];
   char userPattern5 = userPattern[5];
   char userPattern6 = userPattern[6];
   char userPattern7 = userPattern[7];
   char userPattern8 = userPattern[8];
   char userPattern9 = userPattern[9];

   for (i = 0; i < 2; ++i) {
      if (simonPattern0 == userPattern0) {
         userScore = ++userScore;
      }
      if (simonPattern0 != userPattern0) {
         break;
      }
      if (simonPattern1 == userPattern1) {
         userScore = ++userScore;
      }
      if (simonPattern1 != userPattern1) {
         break;
      }
      if (simonPattern2 == userPattern2) {
         userScore = ++userScore;
      }
      if (simonPattern2 != userPattern2) {
         break;
      }
      if (simonPattern3 == userPattern3) {
         userScore = ++userScore;
      }
      if (simonPattern3 != userPattern3) {
         break;
      }
      if (simonPattern4 == userPattern4) {
         userScore = ++userScore;
      }
      if (simonPattern4 != userPattern4) {
         break;
      }
      if (simonPattern5 == userPattern5) {
         userScore = ++userScore;
      }
      if (simonPattern5 != userPattern5) {
         break;
      }
      if (simonPattern6 == userPattern6) {
         userScore = ++userScore;
      }
      if (simonPattern6 != userPattern6) {
         break;
      }
      if (simonPattern7 == userPattern7) {
         userScore = ++userScore;
      }
      if (simonPattern7 != userPattern7) {
         break;
      }
      if (simonPattern8 == userPattern8) {
         userScore = ++userScore;
      }
      if (simonPattern8 != userPattern8) {
         break;
      }
      if (simonPattern9 == userPattern9) {
         userScore = ++userScore;
      }
      if (simonPattern9 != userPattern9) {
         break;
      }
      
   }

  

   cout << "userScore: " << userScore << endl;

   return 0;
}

虽然这确实通过了对 simonPattern 的几个不同分配的测试和 userPattern ,我不禁觉得这是纯粹的蛮力,考虑到只有 <iostream> 的限制,本可以用更少的代码编写。和 <string> .我也知道 if链条,但是当我尝试 forwhile它会抛出错误。

最佳答案

您不需要所有这些变量——您已经有了可以使用的数组!数组的美妙之处在于您可以使用其他变量对它们进行索引,这使您可以将所有重复的逻辑折叠到另一个循环中。

你的程序可以这样写:

#include <iostream>
#include <string>
using namespace std;

int main() {
   string simonPattern;
   string userPattern;
   int userScore = 0;
   int i = 0;

   userScore = 0;
   simonPattern = "RRGBRYYBGY";
   userPattern  = "RRGBBRYBGY";

   for (i = 0; i < 2; ++i) {
      bool stop = false;
      for (int j = 0; j < 10; j++) {
         if (simonPattern[j] == userPattern[j]) {
            userScore = ++userScore;
         }
         else {
            stop = true;
            break;
         }
      }
      
      if (stop)
         break;
   }

   cout << "userScore: " << userScore << endl;

   return 0;
}

不可否认,不得不介绍bool stop从内循环中跳出外循环有点麻烦。但是我们可以通过将逻辑分解到一个函数中来解决这个问题,我们可以从中简单地 return当我们想要的时候:

#include <iostream>
#include <string>
using namespace std;

int calculateUserScore(const string& simonPattern, const string& userPattern) {
   int userScore = 0;
   
   for (int i = 0; i < 2; ++i) {
      for (int j = 0; j < 10; j++) {
         if (simonPattern[j] == userPattern[j])
            ++userScore;
         else
            return userScore;
      }
   }

   return userScore;
}

int main() {
   string simonPattern = "RRGBRYYBGY";
   string userPattern  = "RRGBBRYBGY";

   cout << "userScore: " << calculateUserScore(simonPattern, userPattern) << endl;
}

请注意,我还将您的初始分配移到了初始化中,并删除了多余的 return 0main ,为了更简洁。 userScore = ++userScore还包含冗余; ++已经执行了增量,不需要重新分配这样做的结果。

最后,我不知道 i < 2 的目的是什么循环是:为什么这一切都要做两次?确保您真的打算这样做。

关于c++ - 比较两个字符串的每个字符。新的和寻找输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65493539/

相关文章:

c++ - QTextStream 按点对齐(小数分隔符)

java - 比较作者类中两个作者对象的方法

php - 为什么在 PHP 中对日期格式为 "YYYY-MM-DD"的两个字符串进行小于或大于比较工作,即使它们是字符串?

c++ - 在易于使用的函数/类中包装 boost gzip 压缩器

c++ - 链接错误 : QtCore. framework/Versions/4/QtCore for architecture x86_64

c++ - Makefile - 创建一个静态库

java - 将字符串从 Java 转换为 C++

c++ - 将字符串写入c++文件(QT4)

string - 是否可以通过从另一个字符串中仅删除一个字符来形成一个字符串

php - 比较并突出显示php中包含html的两个字符串的差异