Разделение аргумента командной строки в C - PullRequest
0 голосов
/ 28 октября 2018

Я хочу разбить первый аргумент командной строки на два разных числа.Я получил ошибку ошибки сегментации при запуске программы следующим образом:

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 голосов
/ 28 октября 2018

Вы не проверяете, есть ли хотя бы один аргумент командной строки, или что этот аргумент имеет длину менее 200 символов, а также вы не проверяете возвращаемые значения strtok: у вас будет неопределенное поведение, если задана командабез аргумента или если аргумент не содержит символов v, V или ,.

Если вы эффективно скомпилируете программу с 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;
}
0 голосов
/ 28 октября 2018

Вы должны определить 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;

}
0 голосов
/ 28 октября 2018

Приведенные аргументы кода и командной строки не являются ошибками сегмента.Однако, если в аргументе командной строки либо пропущен разделитель, либо он содержит пробел перед вторым числом, либо пропущен какой-либо аргумент вообще, произойдет сбой.

Следующее предотвратит ошибочный ввод, вызывающий ошибку времени выполнения:

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); 
        }
    }
}
0 голосов
/ 28 октября 2018

В вашем входе есть только один "V".Второй вызов strtok() не находит V и возвращает NULL.

...