2013-04-18 3 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; 
} 

, 내가 이렇게 0 또는 1, 숫자 1 네 번째 인수 것으로 교체했습니다 내 새로운 기능은 다음과 같습니다 그것은 내가 몇 가지 다른 일을 해봤 1의 나 strlen이 있어야합니다,하지만 난 항상이 오류를 얻을 :이 놀 때

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은 정수이며, 길이가 2이고 ASCII 문자 '1'(값 49)과 null 바이트 (종결 자)가 포함 된 문자 배열입니다. 함수는 정수를 원하지 않으며, char 포인터를 원합니다. strlen("1") = 1은 문자열이 null 바이트로 구분되기 때문에 1입니다.

+0

감사합니다. 나는 모든 것을 이해하지만 여전히 해결책을 찾지 못합니다. 그 인수로 대체 한 많은 것들 중에는 "1", strlen ("1")뿐만 아니라 char *을 선언하고 1 (NULL 종결 자)의 값을 할당하는 것도 있습니다. – Alex

+0

게시 한 새 코드에서 setxattr의 세 번째 인수는 int입니다. 원래 코드처럼 char 포인터 여야합니다. 문자열이 아닌 INTEGER를 전달하려고합니다! – DoxyLover

0

함수에 전달하기 전에 atoi()를 사용하여 인수를 정수로 변환 해 보았습니까? 네가 할 필요가없는 경우 왜 숫자를 문자열로 전달해야하는지 분명하지 않다.