실행 프로그램을 메인 루틴 내에서 호출 할 수있는 함수로 변환하려고 고민 중입니다.커맨드 라인의 데이터 타입 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로 대체 할 수 없는지 이해할 수 없습니다. 타이핑 문제에 관해서는 캐스팅을 시도했습니다 (일반적으로 나쁜 생각이라고 생각합니다). 그러나 그것을 만들 수 없습니다. 작업.
아무도 도와 줄 수 있습니까? 감사!
감사합니다. 나는 모든 것을 이해하지만 여전히 해결책을 찾지 못합니다. 그 인수로 대체 한 많은 것들 중에는 "1", strlen ("1")뿐만 아니라 char *을 선언하고 1 (NULL 종결 자)의 값을 할당하는 것도 있습니다. – Alex
게시 한 새 코드에서 setxattr의 세 번째 인수는 int입니다. 원래 코드처럼 char 포인터 여야합니다. 문자열이 아닌 INTEGER를 전달하려고합니다! – DoxyLover