Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++ 检查命令行参数不是char c++;_C++_Command Line Arguments - Fatal编程技术网

C++ 检查命令行参数不是char c++;

C++ 检查命令行参数不是char c++;,c++,command-line-arguments,C++,Command Line Arguments,我试图检查命令行参数是字母还是数字 int main(int argc, char* argv[]) { if(argv[1] is not int) //How does it check if it is number or alphabets { cerr<< "arguments must be integer" << endl; return -1; } } 使用标准库执行此操作的一种方法是使用中的st

我试图检查命令行参数是字母还是数字

int main(int argc, char* argv[])
{
    if(argv[1] is not int) //How does it check if it is number or alphabets
    { 
        cerr<< "arguments must be integer" << endl;
        return -1;
    }
}

使用标准库执行此操作的一种方法是使用
中的
strtol
。另一个使用
istringstream

char *endptr;
const long int argument = strtol (argv[1], &endptr, 10);  // <cstdlib>
if(endptr[0] != '\0') {
    cerr << "arguments must be integer" << endl;
    return -1;
} else if (argument == LONG_MIN || argument == LONG_MAX) {  // <climits>
    // Alternatively you can check for ERANGE in errno
    cerr << "arguments value is out of range" << endl;
    return -1;
} else {
    /* Right type of argument received */
    [..]
}
char*endptr;
常量long int参数=strtol(argv[1],&endptr,10);//
如果(endptr[0]!='\0'){
cerr(更多){

cerr首先,命令行参数可能存在多个字符。因此,您必须迭代所有字符:

for(char* arg = argv[1]; *arg; ++arg)
现在,我假设您希望将包含任何非数字字符的字符串分类为非数字,因此在循环中,您将检查每个字符的数字:

if(!isdigit(static_cast<unsigned char>(*arg)))
{
    // non-number-string!

    break; // no need to go on...
}
或:

C型变体:

int n, int l;
if(sscanf(argv[1], "%d%n", &n, &l) == 1 && argv[1][l] == 0)
{
    // successfully scanned an integer and end of string reached -> is a number
}

最简单的方法是将参数传递到
strtol
std::stoi
中,查看参数是否可以解析为整数。使用std::isalphaNIce谢谢,我已将我的问题编辑为(argv[1]不是数字)但还是回答了我的问题。我的脑海中浮现出了使用try-and-catch的想法。你认为这样更好吗?比如在strtol中使用“\0”是什么意思?@GlenioAlsinTan
”\0“
是空字符的字符代码。C中的字符串必须以空字符结尾;否则常见的字符串操作例程不知道何时停止处理。在
strtol
的情况下,当它发现任何不可能是数字的东西时,就会停止解析。这可能是空终止符,也可能是任何不是数字的东西。
strtol
endptr
设置为指向停止解析的字符。如果它指向空终止符,则整个已读取字符串。如果它指向任何其他内容,则整个字符串不是整数。@user4581301 strtol(argv[1],&endptr,10)如何处理;常数10的含义是什么?假设它是基数,它会发生什么变化?@GlenioAlsinTan
10
是数字的基数或基数。您可以将
10
设置为十进制,
2
设置为二进制,
16
设置为十六进制等。如果使用值
0
,则意味着从字符串自动推断基数。例如,如果字符串开始s使用
0
,数字解析为八进制,以
0x
开头的数字解析为十六进制,以非零数字开头的数字解析为十进制。
if(!isdigit(static_cast<unsigned char>(*arg)))
{
    // non-number-string!

    break; // no need to go on...
}
std::istringstream s(argv[1]);
int n;
s >> n;
if(s) // number read?
{
    char c;
    s >> c;
    if(!s.eof())
    {
        // not last character reached!
        // -> no number
    }
}
char* end;
long number = strtol(argv[1], &end, 10);
//                              ^ needed for detecting, if end of string reached
if(*end || errno == ERANGE)
{
    // doesn't point to terminating null character -> no number
    // or number read was out of range
}
int n, int l;
if(sscanf(argv[1], "%d%n", &n, &l) == 1 && argv[1][l] == 0)
{
    // successfully scanned an integer and end of string reached -> is a number
}