如何检查 optarg 的长度以及它是否为数字
How to check for length of optarg and if it is numeric
我正在使用 getopt
来解析传递给我的 c 程序的参数。我想在解析时检查 optarg
是否全是数字,但我不知道如何获取 optarg
:
中值的长度
int opt;
unsigned short port;
while((opt = getopt(argc, argv, "p:")) != EOF) {
switch(opt) {
case 'p':
for(int i = 0; i < OPTARG_LENGTH; i++) {
if(!isnum[optarg[i]]) exit();
}
port = strtoul(optarg, NULL, 10);
break;
}
那我怎么知道 OPTARG_LENGTH
呢?
strlen(optarg)
会为您提供该信息,但不要尝试使用那种幼稚的方法检查整数值,让 strtoul
为您进行精确检查。
为此,您必须修改调用它的方式以在 char 指针上传递指针,以便 strtoul
指出错误(如果有的话)。
(比如超过unsigned long limit,你的check就没用了)
另请注意,port
是一个无符号短整型,因此您必须在分配之前执行额外检查,否则会溢出。
char *temp;
unsigned long port_ul = strtoul(optarg,&temp,10);
if (optarg != temp && *temp == '[=10=]' && port_ul <= USHRT_MAX) // needs #include <limits.h>
{
// argument is properly parsed: ok
port = port_ul;
}
检查分为 3 个部分:
- 检查
*temp
实际上指向字符串的末尾
- 检查字符串是否为空(经常被遗忘,感谢 chux 在另一个答案中的提示)
- 因为没有标准的字符串到无符号短的转换,使用
limits.h
来确保你在分配给无符号的短时不会溢出。
我正在使用 getopt
来解析传递给我的 c 程序的参数。我想在解析时检查 optarg
是否全是数字,但我不知道如何获取 optarg
:
int opt;
unsigned short port;
while((opt = getopt(argc, argv, "p:")) != EOF) {
switch(opt) {
case 'p':
for(int i = 0; i < OPTARG_LENGTH; i++) {
if(!isnum[optarg[i]]) exit();
}
port = strtoul(optarg, NULL, 10);
break;
}
那我怎么知道 OPTARG_LENGTH
呢?
strlen(optarg)
会为您提供该信息,但不要尝试使用那种幼稚的方法检查整数值,让 strtoul
为您进行精确检查。
为此,您必须修改调用它的方式以在 char 指针上传递指针,以便 strtoul
指出错误(如果有的话)。
(比如超过unsigned long limit,你的check就没用了)
另请注意,port
是一个无符号短整型,因此您必须在分配之前执行额外检查,否则会溢出。
char *temp;
unsigned long port_ul = strtoul(optarg,&temp,10);
if (optarg != temp && *temp == '[=10=]' && port_ul <= USHRT_MAX) // needs #include <limits.h>
{
// argument is properly parsed: ok
port = port_ul;
}
检查分为 3 个部分:
- 检查
*temp
实际上指向字符串的末尾 - 检查字符串是否为空(经常被遗忘,感谢 chux 在另一个答案中的提示)
- 因为没有标准的字符串到无符号短的转换,使用
limits.h
来确保你在分配给无符号的短时不会溢出。