如何检查argv[1]不';你没有字母字符吗? 这一直驱动着我整个C++类,我们都没能找到解决这个问题的可靠方法。 我们正在通过终端通过argv*[1]向程序传递信息。我们将调用程序/main 3,程序将运行3次
当我们验证输入时,问题就出现了,我们试图覆盖我们的所有基础,对于大多数基础,我们都很好,比如输入的字母字符、负数、0等等。但是不断传递的是如何检查argv[1]不';你没有字母字符吗? 这一直驱动着我整个C++类,我们都没能找到解决这个问题的可靠方法。 我们正在通过终端通过argv*[1]向程序传递信息。我们将调用程序/main 3,程序将运行3次,c++,validation,input,argv,C++,Validation,Input,Argv,当我们验证输入时,问题就出现了,我们试图覆盖我们的所有基础,对于大多数基础,我们都很好,比如输入的字母字符、负数、0等等。但是不断传递的是int后跟str,例如/main 3e或/main 1.3。我试过了 (阿什温的回答吸引了我的眼球)但它似乎不起作用,或者至少我无法在代码中实现它 这是我现在的代码: int main(int argc, char * argv[]){ if (!argv[1]) exit(0); int x = atoi(argv[1]); if
int
后跟str
,例如/main 3e
或/main 1.3
。我试过了
(阿什温的回答吸引了我的眼球)但它似乎不起作用,或者至少我无法在代码中实现它
这是我现在的代码:
int main(int argc, char * argv[]){
if (!argv[1]) exit(0);
int x = atoi(argv[1]);
if (!x or x <= 0) exit(0);
// I would like to add another exit(0); for when the input mixes numbers and letters or doubles.
for (int i = 0; i < x; i++){
// rest of the main func.
}
intmain(intargc,char*argv[]){
如果(!argv[1])退出(0);
intx=atoi(argv[1]);
如果(!x或x不考虑标题,听起来您真正想做的是检查输入参数中的每个字符是否都是数字。您可以通过对其进行迭代来实现这一点,使用
下面是使用该算法的草图:
size_t len = strlen(argv[1]);
bool ok = std::all_of(argv[1], argv[1] + len,
[](unsigned char c) { return std::isdigit(c); } );
如果需要,您可以为第一个元素'0'
添加额外的检查。如果您想将字符串转换为数字并验证整个字符串是否为数字,您可以使用strtol
而不是atoi
。作为额外的奖励,strtol
正确地检查溢出并为您提供sp选项指定是否需要十六进制/八进制转换
这里是一个简单的实现,记录了所有的错误(从这样一个函数打印错误消息不是一个好主意;我只是为了简洁起见才这么做)。更好的选择可能是返回一个错误枚举而不是bool,但是这个函数返回一个std::pair
:或者(false,)
或者(true,value)
:
std::对安全获取(const char*s){
char*endptr;
bool ok=false;
errno=0;/*因此我们可以稍后检查ERANGE*/
long val=strtol(s,&endptr,10);/*不允许十六进制或八进制*/
if(endptr==s)/*包括s只是空白的情况*/
std::你有什么理由不能编写一个函数来检查argv[1]
中的每个字符吗?而且,在我看来,检查参数“没有任何字母字符”并不是你真正想做的事情。strtol是你的朋友。我试过了,但它给了我错误(与char*有关)你是在寻找字母输入还是非整数输入?@jaggedSpire我想两者都是,我真的只需要argv[1]是和int,但我也很好奇如何解决ints
后跟str
的问题。你就不能只做std::all_of(argv[1],argv[1]+len,&std::isdigit)
?(真好奇)@Qix有两个潜在的问题:还有另一个std::isdigit
重载,为了安全起见,我想将输入转换为无符号字符。但我不确定后者在这里是否严格必要。无论如何,这会给我带来一个错误:候选模板被忽略:无法推断模板参数'\u谓词'代码>同样,我尝试了几件事,也得到了错误:error:“all\u of”不是“std”的成员
@lokilindo那么你又做错了什么……但是认真地写一个循环,这个答案的重点不是使用all\u of
。这只是一个例子。
std::pair<bool, int> safe_get_int(const char* s) {
char* endptr;
bool ok = false;
errno = 0; /* So we can check ERANGE later */
long val = strtol(s, &endptr, 10); /* Don't allow hex or octal. */
if (endptr == s) /* Includes the case where s is just whitespace */
std::cout << "You must specify some value." << '\n';
if (*endptr != '\0')
std::cout << "Argument must be an integer: " << s << '\n';
else if (val < 0)
std::cout << "Argument must not be negative: " << s << '\n';
else if (errno == ERANGE || val > std::numeric_limits<int>:max())
std::cout << "Argument is too large: " << s << '\n';
else
ok = true;
return std::make_pair(ok, ok ? int(val) : 0);
}