在C中拆分命令行参数

时间:2018-10-28 13:22:24

标签: c split command-line-arguments

我想将第一个命令行参数分成两个不同的数字。这样运行程序时出现分段错误错误:

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;
}

如何解决此问题?

4 个答案:

答案 0 :(得分:3)

您不会测试是否至少有一个命令行参数,或者该参数的长度小于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=%d\n", a, b);
    return 0;
}

答案 1 :(得分:1)

给出的代码和命令行参数不存在段错误。但是,如果命令行参数忽略定界符,在第二个数字之前包含空格或完全忽略任何参数,则它将失败。

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

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); 
        }
    }
}

答案 2 :(得分:-1)

您的输入中只有一个"V"。对strtok()的第二次调用未找到V,并返回NULL

答案 3 :(得分:-1)

您必须在函数的开头定义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;

}