如何检查输入的长度? (C++)

Posted

技术标签:

【中文标题】如何检查输入的长度? (C++)【英文标题】:How to check the length of an input? (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);" linux.die.net/man/3/snprintf 【参考方案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);

【讨论】:

以上是关于如何检查输入的长度? (C++)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中检查用户输入

如何在 C++ 中检查二维数组中负值的输入验证?

如何在 C++ 中将字符串转换为 int?

如何使用循环和数组比较和检查 C++

如何在 C++ 的条件语句中检查变量类型?

如何检查 C++ 字符串是不是为 int?