如何检查 argv[count] 是否为整数
How to check if argv[count] is an integer
我正在尝试用 C++ 创建一个命令行应用程序,我想确保输入是某个命令参数后的整数。
对于这个例子,我想检查“-p”命令参数之后的下一个参数是否是一个整数。这是我现在的代码片段。
while (count < argc){
if (strcmp("-p", argv[count]) == 0){
has_p = true; //Boolean
pid = atoi(argv[count + 1]);
if (pid == 0 && argv[count + 1] != "0" ){
err = 1;
cout << "pid argument is not a valid input" << endl;
pid = -1;
}
count++;
}
...
}
现在这段代码正确地捕获了这个输入中的错误:
- -p 1777
- -p sss
- -p sss17
- -p[space]-U
但在此输入格式下失败
- -p 17sss
我试图通过尝试使用 sprintf 进行比较来解决这个问题。不幸的是,为 sprintf 提供 char 数组指针只会在 buffer2 中输出 1 个字符。
while (count < argc){
if (strcmp("-p", argv[count]) == 0){
has_p = true; //Boolean
pid = atoi(argv[count + 1]);
sprintf(buffer, "%d", pid);
sprintf(buffer2, "%d", *argv[count + 1]);
if (pid == 0 && argv[count + 1] != "0" || (buffer != buffer2) ){
err = 1;
cout << "pid argument is not a valid input" << endl;
pid = -1;
}
count++;
}
...
}
有没有办法让 sprintf 读取整个 char 数组?如果没有,除了循环指针直到我点击“\0”
之外,是否有更好的解决方案
atoi()
不能如你所愿。您需要使用 strtol()
来实现此目的。它大大提高了错误检查能力。
签名:
long int strtol(const char *nptr, char **endptr, int base);
此函数returns 将转换后的整数作为 long int 值,否则返回零值。
转换后,您可以查看 endptr
的内容并做出决定。
您还可以使用根据 strtol 实现的 c++11 替代方案(参见 stol)。
下面是方便的单行...
sscanf(argv[count + 1], "%d%*c", &n) == 1
...如果可以读入 int n
并且之后没有尾随字符,则计算结果为真。 %*c
中的 '*' 禁止赋值,因此无需传递指向虚拟 char
变量的指针。参见 scanf docs here。
在 C 中,您可以简单地遍历 char* 并检查是否只有数字。
char c = '0';
int i = 0;
int err = 0
while ( c != '[=10=]'){
if (arg[i] < 47 || arg[i] > 57){
err = 1;
break;
}
我正在尝试用 C++ 创建一个命令行应用程序,我想确保输入是某个命令参数后的整数。
对于这个例子,我想检查“-p”命令参数之后的下一个参数是否是一个整数。这是我现在的代码片段。
while (count < argc){
if (strcmp("-p", argv[count]) == 0){
has_p = true; //Boolean
pid = atoi(argv[count + 1]);
if (pid == 0 && argv[count + 1] != "0" ){
err = 1;
cout << "pid argument is not a valid input" << endl;
pid = -1;
}
count++;
}
...
}
现在这段代码正确地捕获了这个输入中的错误:
- -p 1777
- -p sss
- -p sss17
- -p[space]-U
但在此输入格式下失败
- -p 17sss
我试图通过尝试使用 sprintf 进行比较来解决这个问题。不幸的是,为 sprintf 提供 char 数组指针只会在 buffer2 中输出 1 个字符。
while (count < argc){
if (strcmp("-p", argv[count]) == 0){
has_p = true; //Boolean
pid = atoi(argv[count + 1]);
sprintf(buffer, "%d", pid);
sprintf(buffer2, "%d", *argv[count + 1]);
if (pid == 0 && argv[count + 1] != "0" || (buffer != buffer2) ){
err = 1;
cout << "pid argument is not a valid input" << endl;
pid = -1;
}
count++;
}
...
}
有没有办法让 sprintf 读取整个 char 数组?如果没有,除了循环指针直到我点击“\0”
之外,是否有更好的解决方案atoi()
不能如你所愿。您需要使用 strtol()
来实现此目的。它大大提高了错误检查能力。
签名:
long int strtol(const char *nptr, char **endptr, int base);
此函数returns 将转换后的整数作为 long int 值,否则返回零值。
转换后,您可以查看 endptr
的内容并做出决定。
您还可以使用根据 strtol 实现的 c++11 替代方案(参见 stol)。
下面是方便的单行...
sscanf(argv[count + 1], "%d%*c", &n) == 1
...如果可以读入 int n
并且之后没有尾随字符,则计算结果为真。 %*c
中的 '*' 禁止赋值,因此无需传递指向虚拟 char
变量的指针。参见 scanf docs here。
在 C 中,您可以简单地遍历 char* 并检查是否只有数字。
char c = '0';
int i = 0;
int err = 0
while ( c != '[=10=]'){
if (arg[i] < 47 || arg[i] > 57){
err = 1;
break;
}