Тип данных аргументов командной строки

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

int main(int argc, char* argv[]){
    //do stuff
    if(setxattr(argv[4], tmpstr, argv[3], strlen(argv[3]), 0)){
        perror("setxattr error");
        exit(EXIT_FAILURE);
    }
    //do more stuff
}

Я могу назвать это следующим образом, и он успешно работает:

./set_attributes -s зашифровано 1 ~/text.txt

Но теперь я хочу переместить это в функцию, встроенную в другую программу. Часть, которая терпит неудачу, является strlen(argv[3]). Моя новая функция выглядит так:

int set_encr_attr(char* fpath, int value) {
    
    char* userstr = NULL;
    
    /* Check that the value to set is either 0 or 1 */
    if (!( (value == 0) || (value == 1) )) {
        return -1;
    }
    
    //do stuff (including malloc(userstr)
    strcpy(userstr, XATTR_USER_PREFIX);

    /* Set attribute */
    if(setxattr(fpath, userstr, value, 1, 0)){
        perror("setxattr error");
        exit(EXIT_FAILURE);
    }

    return EXIT_SUCCESS;
}

Как видите, я заменил этот четвертый аргумент числом 1, так как я уже проверил, что передаваемое значение равно 0 или 1, поэтому оно должно иметь strlen, равное 1. Я пробовал несколько способов. другие вещи, но я всегда получаю эту ошибку:

xattr_new.c: в функции set_encr_attr:

xattr_new.c:52:2: предупреждение: передача аргумента 3 setxattr делает указатель целым без приведения [включено по умолчанию]

/usr/include/i386-linux-gnu/sys/xattr.h:40:12: примечание: ожидается ‘const void *’, но аргумент имеет тип ‘int’

Когда я играю с этим, я вижу, что strlen(argv[3]) == 1, поэтому я не понимаю, почему я не могу просто заменить это целым числом 1. Что касается проблемы ввода, я пробовал кастинг (что я считаю вообще плохой идеей), но я не могу заставить его работать.

Кто-нибудь может помочь? Спасибо!


person AndroidDev    schedule 18.04.2013    source источник


Ответы (2)


1 — целое число, "1" — строка, массив символов длиной 2, содержащий символ ASCII «1» (значение 49), за которым следует нулевой байт (терминатор). Функция не хочет целое число, ей нужен указатель на char. strlen("1") = 1, потому что строка ограничена нулевым байтом.

person DoxyLover    schedule 18.04.2013
comment
Спасибо. Я все это понимаю, но решения пока не вижу. Среди многих вещей, которые я заменил для этого аргумента, — 1, strlen(1), а также объявление char* и присвоение ему значения 1 (и ограничителя null). - person AndroidDev; 18.04.2013
comment
В опубликованном вами новом коде третьим аргументом setxattr является int. Это должен быть указатель на символ, как в исходном коде. Вы пытаетесь передать INTEGER, а не строку! - person DoxyLover; 18.04.2013

Вы пытались использовать atoi() для преобразования ваших аргументов в целые числа перед передачей их в вашу функцию? Мне непонятно, почему вы хотите передать число в виде строки символов, если вам это не нужно.

person JWDN    schedule 18.04.2013