0

そのため、次のタイプの入力を正しく解析する関数をセットアップしようとしています (この入力は、私の例を説明するためだけにぎこちないことに注意してください)

"./test script";ls -a -o;mkdir "te>st";ls > somefile.txt

各コマンドが「;」で区切られている場所 また、各引数は空白 ' ' で区切られています。ただし、"" で囲まれている場合は、リテラルまたは全体として処理する必要があります。IE私がこれから望む出力は

cmd : "./test スクリプト"

cmd : ls args[2] {-a, -o}

cmd : mkdir args[1] { "te>st" }

cmd : ls args[2] {>, somefile.txt}

; で分割してみました。最初に、次に ' ' を使用しますが、最初の例は失敗します ("" で囲まれているため、全体と見なす必要があります)。言語にあまり詳しくないため、c に問題があります。誰か助けてもらえますか? これは私がこれまでに持っているものです

    // Commands split with ; 
    char *cmdSplitToken = strtok(srcPointer, ";");

    // Store commands seperately so we can deal with them one by one
    while(cmdSplitToken != NULL) {      
        cmds[cmdCount++] = cmdSplitToken;
        cmdSplitToken = strtok(NULL, ";");
    }

    // Loop over commands and gather arguments
    for(int i = 0; i < cmdCount; i++) {     
        // args split with ' '
        char *argSplitToken = strtok(cmds[i], " "); 
        int argCount = 0;
        while(argSplitToken != NULL) {      
            printf("arg %s\n", argSplitToken);
            argCount++;
            argSplitToken = strtok(NULL, " ");
        }
    }
4

2 に答える 2

0

strtok複雑なルール (二重引用符が埋め込まれたフィールド) を扱う必要がある場合や、独自の関数を作成したり、ライブラリを使用したりする必要がある場合は、 の使用を避けてください。純粋な ANSI C89 で記述された小さくてシンプルなライブラリであるlibcs​​vを参照することをお勧めします。

于 2013-07-31T05:32:19.247 に答える