0

実行可能プログラムを、メイン ルーチン内から呼び出すことができる関数に変換するのに苦労しています。現在書かれているように、実行可能ファイルは次のようになります。

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;
}

ご覧のとおり、4 番目の引数を数値 1 に置き換えました。渡される値が 0 または 1 であることを既に確認しているため、strlen は 1 でなければなりません。他のことですが、私は常にこのエラーが発生します:

xattr_new.c: 関数 'set_encr_attr' 内:

xattr_new.c:52:2: 警告: 'setxattr' の引数 3 を渡すと、キャストなしで整数からポインターが作成されます [デフォルトで有効]

/usr/include/i386-linux-gnu/sys/xattr.h:40:12: 注: 'const void *' が必要ですが、引数の型は 'int' です</p>

これで遊んでみると、strlen(argv[3]) == 1 であることがわかります。なぜこれを整数 1 に置き換えることができないのかわかりません。入力の問題については、試してみましたキャスト(これは一般的に悪い考えだと思います)ですが、うまくいきません。

誰でも助けることができますか?ありがとう!

4

2 に答える 2

0

引数を関数に渡す前に、atoi() を使用して引数を整数に変換してみましたか? 数字を文字列として渡す必要がないのに、なぜ渡す必要があるのか​​ 、私にはわかりません。

于 2013-04-18T09:42:33.507 に答える