Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检查输入的长度?(C+;+;)_C++_String - Fatal编程技术网

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

C++ 如何检查输入的长度?(C+;+;),c++,string,C++,String,我有一个程序,允许用户输入关卡编号,然后播放该关卡: 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。所有文件夹都列为三位数。我不能只检查lvlinp

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

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字符串的长度,因为它是一个数组,那么我如何确保用户输入了三位数字呢?

你真的问错了问题。调查C++ STD::String类,然后返回这里。

< p>为什么不使用? 这使得存储、连接和修改更加容易

如果在之后需要c样式字符串,请使用:
my\u string.c\u str()


这里有一个提示:要使您的输入长度为3个字符,请使用0作为数字的前缀。

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

Eh?为什么他们需要输入3位数字?如果他们不这样做,为什么不干脆把它垫起来呢?如果您确实想检查他们是否输入了3位数字,请使用。但是我建议你做的是他们的输入,然后
sprintf(cmd,“levelplayer.exe%03d”,lvlinput_as_integer)
尼尔告诉你应该从哪里开始,你的代码可能是这样的

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());
}
std::string level,game=“levelplayer.exe”;
标准::cout>水平;
如果(level.size()!=3)
{
//错误!
}
其他的
{
//如果您有更多的处理,它会出现在这里:)
游戏+=关卡;
系统(game.c_str());
}

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

int len = strlen(lvlinput);
这是因为返回以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++中实现这一点:

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::string lvlinput;
std::getline(std::cin,lvlinput);
如果(lvlinput.size()>3){//如果输入太长,我们无能为力
抛出std::exception(“输入字符串太长”);
}
而(lvlinput.size()<3){//如果它太短,我们可以通过在零之前加上前缀来修复它
lvlinput=“0”+lvlinput;
}
std::string param_str=“levelplayer.exe”;
param_str+=lvlinput;
系统(param_str.c_str());
您有一个很好的string类,它为您处理连接、长度和所有其他复杂的事情。所以使用它


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

为什么不能检查字符串的len?“len=strlen(lvlinput);”您可能希望执行以下操作:snprintf(param_str,20,“levelplayer.exe%03d”,atoi(lvlinput);"00003应该是一个有效的输入,而使用循环来填充似乎并不正确。在内部,每次添加0时,它都必须向下移动整个字符串。他没有说00003应该是一个有效的输入,你是对的,循环效率不高,但这有关系吗?精确的数据验证取决于操作。我只是简单地展示了它是如何接近的chy,他应该如何使用C++字符串而不是char数组。@ Mark:我并不太在意验证每个可能的条目(我已经可以这么做了),我只是不知道在添加到char数组之前如何检查字符串的长度。我不需要将其设置为三位数,我只需要检查用户是否输入了三位数。如果您不需要输入任何特定的长度,为什么您关心用户输入了多少位数?总之,我给您的第一个链接是应该有siz()给字符串长度。LVLIPUT已经定义为长度为3,因此用户输入3, 03、003或0003,LVLIN的长度总是3。LVLIN PUT如何定义为长度为3?您应该花一些时间来阅读C++中字符串是如何工作的。