【问题标题】:How to check the length of an input? (C++)如何检查输入的长度? (C++)
【发布时间】:2009-07-03 19:58:26
【问题描述】:

我有一个程序允许用户输入关卡编号,然后播放该关卡:

char lvlinput[4];
std::cin.getline(lvlinput, 4)
char param_str[20] = "levelplayer.exe "
strcat_s(param_str, 20, lvlinput);
system(param_str);

而关卡数据存储在\001、\002、\003等文件夹中。但是,我无法判断用户是否输入了三个数字,即:1、01或001。并且所有文件夹都被列为三位数字。我不能只检查 lvlinput 字符串的长度,因为它是一个数组,那么如何确保用户输入了三位数字?

【问题讨论】:

  • 为什么不能检查字符串的len? “len=strlen(lvlinput);”您可能想要执行以下操作: snprintf(param_str, 20, "levelplayer.exe %03d", atoi(lvlinput);"

标签: c++ string


【解决方案1】:

为什么不使用std::string
这使得存储、连接和修改变得更加容易。

如果后面需要 c 风格的字符串,请使用:my_string.c_str()

这里有一个提示:要使您的输入长度为 3 个字符,请使用 std::insert 在您的号码前加上 0。

【讨论】:

  • 我不需要让它长三位数,我只需要检查用户是否输入了三位数。
  • 如果你不需要输入任何特定的长度,你为什么要关心用户输入了多少位?无论如何,我给你的第一个链接应该有 size() 给你字符串长度。
【解决方案2】:

你真的问错了问题。研究 C++ std::string 类,然后回到这里。

【讨论】:

    【解决方案3】:

    诶?为什么他们需要输入 3 位数字?如果他们不这样做,为什么不直接填充呢?如果您真的想要检查他们是否输入了 3 位数字,请使用 strlen。但是我建议你做的是atoi他们的输入,然后是sprintf(cmd, "levelplayer.exe %03d", lvlinput_as_integer)

    【讨论】:

      【解决方案4】:

      以下是在 C++ 中执行此操作的方法:

      std::string lvlinput;
      std::getline(std::cin, lvlinput);
      if (lvlinput.size() > 3) { // if the input is too long, there's nothing we can do
        throw std::exception("input string too long");
      }
      while (lvlinput.size() < 3) { // if it is too short, we can fix it by prepending zeroes
        lvlinput = "0" + lvlinput;
      }
      std::string param_str = "levelplayer.exe ";
      param_str += lvlinput; 
      system(param_str.c_str());
      

      你有一个很好的字符串类,它为你处理连接、长度和所有其他繁琐的事情。所以使用它。

      请注意,我使用std::getline 而不是cin.getline。后者将输入写入 char 数组,而前者写入正确的字符串。

      【讨论】:

      • 00003 应该是一个有效的输入,但使用循环填充似乎不正确。在内部,每次添加 0 时,它都必须将整个字符串向下移动。
      • 他没有说 00003 应该是一个有效的输入,你说得对,循环效率不高,但这有关系吗?精确的数据验证取决于 OP。我只是展示了如何处理它,以及他应该如何使用 C++ 字符串而不是 char 数组。
      • @mark: 我不太关心验证每一个可能的条目(我已经可以这样做了),我只是不知道如何在字符串得到之前检查它的长度附加到 char 数组中。
      【解决方案5】:

      你的意思是你不能检查字符串的长度? getline 生成一个以 NULL 结尾的 c 字符串,因此只需使用 strlen(lvlinput)。

      【讨论】:

      • lvlinput 已经定义为长度为 3,所以无论用户输入 3、03、003 还是 0003,lvlinput 的长度始终为 3。
      • lvlinput如何定义为长度为3?你真的应该花一些时间来了解字符串在 C++ 中是如何工作的。
      【解决方案6】:

      尼尔告诉你应该从哪里开始,你的代码可能看起来像这样。

      std::string level, game = "levelplayer.exe ";
      
      std::cout << "Enter the level number : ";
      std::cin >> level;
      
      if(level.size() != 3)
      {
          // Error!
      }
      else
      {
      // if you have more processing, it goes here :) 
          game += level;
          std::system(game.c_str());
      }
      

      【讨论】:

        【解决方案7】:

        您可以使用以下命令检查 getline 返回的以 NULL 结尾的字符串的长度:

        int len = strlen(lvlinput);
        

        这是因为 getline 返回一个以 NULL 结尾的字符串。

        但是,这不是您的问题的重点。如果您想远离 std::string (并且在这种情况下没有任何特殊原因应该这样做),那么您应该将字符串转换为整数,并使用整数来构造去往的命令系统文件:

        char lvlinput[4];
        std::cincin.getline(lvlinput, 4);
        char param_str[20];
        snprintf(param_str, 20, "levelplayer.exe %03d", atoi(lvlinput));
        system(param_str);
        

        【讨论】:

          猜你喜欢
          • 2011-12-14
          • 2018-11-06
          • 2012-08-23
          • 2012-01-20
          • 1970-01-01
          • 2011-11-19
          • 2015-02-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多