Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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
如何检查argv[1]不';你没有字母字符吗? 这一直驱动着我整个C++类,我们都没能找到解决这个问题的可靠方法。 我们正在通过终端通过argv*[1]向程序传递信息。我们将调用程序/main 3,程序将运行3次_C++_Validation_Input_Argv - Fatal编程技术网

如何检查argv[1]不';你没有字母字符吗? 这一直驱动着我整个C++类,我们都没能找到解决这个问题的可靠方法。 我们正在通过终端通过argv*[1]向程序传递信息。我们将调用程序/main 3,程序将运行3次

如何检查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

当我们验证输入时,问题就出现了,我们试图覆盖我们的所有基础,对于大多数基础,我们都很好,比如输入的字母字符、负数、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 (!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);
}