2013-04-18 5 views
0

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

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 encrypted 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: In function ‘set_encr_attr’:

xattr_new.c:52:2: warning: passing argument 3 of ‘setxattr’ makes pointer from integer without a cast [enabled by default]

/usr/include/i386-linux-gnu/sys/xattr.h:40:12: note: expected ‘const void *’ but argument is of type ‘int’

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

Может ли кто-нибудь помочь? Благодаря!

ответ

0

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

+0

Спасибо. Я все это понимаю, но я до сих пор не вижу решения. Среди многих вещей, которые я заменил для этого аргумента, есть «1», strlen («1»), а также объявление char * и присвоение ему значения 1 (и нулевого терминатора). – Alex

+0

В новом коде, который вы отправили, третьим аргументом setxattr является int. Он должен быть указателем символа, как в вашем исходном коде. Вы пытаетесь передать INTEGER, а не строку! – DoxyLover

0

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

Смежные вопросы