如何检查输入的长度? (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++)的主要内容,如果未能解决你的问题,请参考以下文章