ホーム>source

私はcプログラムでコマンドライン引数を渡すことができるプログラムを書いていた。 linuxコマンドは「sample-input」というファイルに保存されています。 cp file1 dest1またはmv file2 dest2のみが含まれます。私の問題は、ファイル内の文字列をトークン化するときです。ファイルの最初の行のみを読み取るようです。これが私のコードです。誰かが私を助けてくれますか?

<前>ウィズウィズ

私の現在のコード。

<前>ウィズウィズ error message i got (after edit): temp1/f4.txt temp1/f5.txt temp1/f6.txt -temp1/f7.c +temp1/f8.c +temp2/f1.txt temp2/f2.c +temp2/f3.txt temp2/f4.txt +temp2/f5.txt temp2/f6.txt temp2/f9.c Test Result: [Failed] my sample-input cp temp1/f1.txt temp2/ mv temp1/f2.c temp2/ cp temp1/f3.txt temp2/ cp temp1/f4.txt temp2/ cp temp1/f5.txt temp2/ cp temp1/f6.txt temp2/ mv temp1/f7.c temp1/f8.c mv temp1/f9.c temp2/ cp temp1/f1.txt temp1/f1a.txt
あなたの答え
  • 解決した方法 # 1

    この

    <前>ウィズウィズ

    である必要があります

    <前>ウィズウィズ

    最初の引数は実行可能ファイルのファイル名であるためです。そして、あなたはそのケースを処理する必要があります、その execvp(array[i], array);  メッセージを発行して終了する(!)ことにより、失敗します。

    <前>ウィズウィズ

    さらに、次のように設定して引数ベクトルをNULLで終了する必要があります

    <前>ウィズウィズ

    あなたのwhileループの後。そして、3つの引数を解析した後にループから抜け出すチェックを追加することをお勧めします。それ以外の場合は execvp(array[0], array);  オーバーフローする可能性があります(境界外に書き込み、未定義の動作につながります)。

    別の問題はあなたの読み取りループです

    <前>ウィズウィズ

    これにより、ファイルが乱暴に読み込まれ、最後または前の最後の行が残ります。あなたはラインハンドリングを入れなければなりません内部 ループ:

    <前>ウィズウィズ

    あなたの入力ファイルによると、それはtabulatorsが引数セパレータでもあるように見えるので、

    <前>ウィズウィズ

    そして

    <前>ウィズウィズ execvp()

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ data structures - この質問の時間の複雑さは何ですか?