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的含义是什么?假设它是基数,它会发生什么变化?@GlenioAlsinTan10
是数字的基数或基数。您可以将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
}