1

このコードは最終的に、コマンド ラインで 1 つの引数、つまり 1 つのファイルで動作するようになりましたが、無制限の数のファイルで動作するという概念でコードを設計しました。それが行うことは、スペースで区切られた単語を含むX個のテキストファイルを取り、スペースを置き換えて\n単語のリストを作成することです。ただし、最初の引数は正常に完了しますが、2 番目の引数は無視されます。

もう 1 つの小さな問題は、最後にゴミ文字 (上に 2 つのドットがある Y) も出力するようです。私はいくつかのEOFシンボルを想定していますが、それを止めることはできません!

int main(int argc, char** argv) {
    FILE *fpIn, *fpOut;
    int i, j;
    j = 1;
    char c;
    char myString[256];

    printf("%d", argc);
    printf("\n");
    printf("The following arguments were passed to main(): ");
                for(i=1; i<argc; i++) printf("%s ", argv[i]);
    printf("\n");

    while(argc--) {
        for(i = 1; i < argc; i++) {
            fpIn = fopen(argv[j], "rb");
            snprintf(myString, 256, "%s~[%d]", argv[j], i);
            fpOut= fopen(myString, "wb");
            while (c != EOF) {
                c = fgetc(fpIn);
                if (isspace(c)) 
                    c = '\n';
                fputc(c, fpOut );
            }
            j++;
        }
    }
    return 0;
}
4

1 に答える 1

4

、および関数(またはマクロ)は、ではなく、をgetchar()返します。getc()fgetc()intchar

使用する必要があります:

int c;

while ((c = fgetc(fpIn)) != EOF)
{
    if (isspace(c))
        c = '\n';
    fputc(c, fpOut);
}

考えてみてください。関数は、有効なchar EOF(有効な値とは異なりcharます。したがって、定義上、戻り値をchar...にすることはできません)を返すことができる必要があります。

使用するとどうなりますcharか?

  • 元のコードはテスト前に初期化されていませんでしcた(そのため、ループが早期に中断する可能性があります)。
  • EOFを読み取った直後にコードがテストされませんでしたc(そのため、ガベージ文字が出力される可能性があります。多くの場合、ÿ、分音付きのラテン文字Y、U + 00FF)。
  • タイプが符号なしの場合、charEOFは表示されません。
  • タイプが署名されている場合char、一部の有効な文字(多くの場合、再びÿ))はEOFとして誤って解釈されます。

しかし、私はまだそれを複数の引数に対して機能させることができないようです。

問題は、実行している二重ループです。

int i, j;
j = 1;

while (argc--)
{
    for (i = 1; i < argc; i++)
    {
        fpIn = fopen(argv[j], "rb");
        ...process fpIn...
        j++;
    }
}

2つのファイル名でコマンドを呼び出したとしましょう。その後argc == 3

whileループを最初に通過した後、 argc == 2。次に、値1を取得してforループを実行します。iあなたが開くargv[1](なぜならj == 1)。そのファイルを処理します。次にj、2にインクリメントしてから、も2にインクリメントします。ループiの2回目は、 == 2であるため、ループは終了します。whileループは再び1に減少しますが、それをテストします。ただし、ループは設定されてから終了します。ループは1に減少し、繰り返されます。foriargcforargc2 != 0fori = 1i == argcwhileargc

whileループまたはループを使用できますが、for両方は必要ありません。

だから、どちらか:

for (i = i; i < argc; i++)
{
    ...process argv[i]...
}

または:

while (--argc > 0)
{
    ...process *++argv...
}

forループを使用します。

于 2011-12-28T00:03:18.790 に答える