0

次のコード行を実行すると、よくわからない問題が発生します。主なアイデアは、ユーザーが検索対象の i ノードに入力することです。見つかったら、その inode に関連付けられたファイル名が出力され、そのファイル名に対してコマンド「stat」が実行され、そのファイルに関する情報が生成されます。

#define COMMAND_LEN 1024
#define DATA_SIZE 1024

int main(int argc, char **argv) {
    FILE *pf;
    char command[COMMAND_LEN];
    char data[DATA_SIZE];
    char inode_data[DATA_SIZE];
    int iNode;

    printf("Enter inode: ");
    scanf(argv[0], iNode);

    sprintf(command, "find -inum %i -type f", iNode);
    pf = popen(command, "r");

    if(!pf){
        fprintf(stderr, "Could not open pipe for outlet.\n");
        return;
    }

    fgets(data, DATA_SIZE, pf);
    fprintf(stdout, "%s\n", data);

    sprintf(command, "stat %s", data);
    pf = popen(command, "r");
    fgets(inode_data, DATA_SIZE, pf);
    fprintf(stdout, "%s\n", inode_data);

    if (pclose(pf) != 0)
        fprintf(stderr, "Error: Failed to close command stream!\n");

    Return 0;
}

コンパイルして実行し、inode 番号を入力すると、次のようになります。

Enter inode: 148869

stat: missing operand
Try 'stat --help' for more information.

Error: Failed to close command stream!

よくある質問の投稿から役立つヘルプを受け取りました sprintf からの情報を変数に保存します

4

2 に答える 2

2

コマンド ライン引数でフォーマット文字列を渡さない限り、このパラメーターを使用scanfしないでください。argv[0]また、scanf は 2 番目のパラメーターとして int* を渡す必要があるため、実際にはそうする必要があります。scanf("%d", &iNode);

于 2013-02-09T06:34:18.557 に答える
0

findマニュアルページを読むと、検索する場所からのパスが必要であることがわかります。findコマンドラインにそれがありません。

また、ユーザーからの入力を正しく読み取れません。argv[0]プログラムの名前です。適切なフォーマット文字列を渡す必要があります。

scanf("%s", iNode);

デバッガーを使用した場合、または の後に入力を印刷した場合でも、scanfこれはすぐにわかるはずです。

于 2013-02-09T06:34:09.087 に答える