在C中拆分命令行参数



我想把第一个命令行参数分成两个不同的数字。我在以这种方式运行程序时遇到了一个分段错误:

gcc -ansi main.c -o main
./main 6000V7000

这是源代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *token;
char arr[200];
strcpy(arr, argv[1]);
token = strtok(arr, "v,V");
int firstNumber = atoi(token);
token = strtok(NULL, "v,V");
int secondNumber = atoi(token);
return 0;
}

如何解决此问题?

您不测试是否至少有一个命令行参数,也不测试此参数的长度是否小于200个字符,也不检测strtok的返回值:如果命令没有给定参数,或者参数不包含任何字符vV,,则会出现未定义的行为。

如果你用gcc -ansi main.c -o main有效地编译程序,并用发布的参数./main 6000V7000运行它,你就不会出现分段错误。。。有些事情你没有告诉我们;(

最好避免疯狂的假设:在所有情况下测试意外情况,以给出程序定义的行为。

以下是使用sscanf():解决问题的更简单方法

#include <stdio.h>
int main(int argc, char *argv[]) {
int a, b;
if (argc > 1 && sscanf(argv[1], "%d%*1[vV,]%d", &a, &b) == 2)
printf("a=%d, b=%dn", a, b);
return 0;
}

给定的代码和命令行参数不会出错。但是,如果命令行参数省略了分隔符,在第二个数字之前包含空格,或者完全省略了任何参数,那么它将失败。

以下将防止错误输入导致运行时错误:

if( argc > 1 )
{
strcpy( arr, argv[1]);
int firstNumber = 0 ;
int secondNumber = 0 ;
token = strtok(arr, "v,V");
if( token != NULL )
{
firstNumber = atoi(token) ;
token = strtok(NULL, "v,V") ;
if( token != NULL )
{
secondNumber= atoi(token); 
}
}
}

您必须在函数的开头定义var:

以下code可以工作:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]){
char *token;
char arr[200];
int firstNumber;
int secondNumber;
strcpy( arr, argv[1]);
token = strtok(arr, "v,V");
firstNumber = atoi(token);
token = strtok(NULL, "v,V");
secondNumber= atoi(token);
return 0;
}

您的输入中只有一个"V"。对CCD_ 10的第二次调用没有发现V并返回CCD_。

最新更新