1

ディレクトリ内のファイルの上書きを処理するプログラムの一部に取り組んでいます。ファイルを上書きするのは簡単ですが、ファイルを上書きするかどうかをユーザーに尋ねるプロンプトを表示するのは明らかにそうではありません。例: 2 つのファイル (fileOne.txt、fileTwo.txt) を上書きする場合、ユーザーに 2 回 (ファイルごとに 1 回) プロンプトを表示する必要があります。現在のプロンプトで、ユーザーに fileOne.txt を上書きするように求めると、fileOne.txt と fileTwo.txt の両方が上書きされます。上書きするファイルが 3 つ以上ある場合、連続する 2 つのファイルのみが上書きされます。「Enter」を押すことと関係があると思いますが、手がかりがありません...

if(((int)getHeader.deleted - 48) == 0) {
        if(access(getHeader.file_name, F_OK) != -1) { /* File exists in directory, check for overwrite */
            printf("%s already exists. Would you like to overwrite it? (y/n)\n", getHeader.file_name);
            scanf("%c", buffer);
            while(!validResponse) {
                if(buffer[0] == 'y' || buffer[0] == 'Y') {
                    validResponse = 1;
                    printf("DO SOMETHING - Files will be overwritten\n");
                } else if(buffer[0] == 'n' || buffer[0] == 'N') {
                    validResponse = 1;
                    printf("DO SOMETHING - File will be skipped\n");
                } else {
                    printf("Invalid response... Would you like to overwrite %s? (y/n)\n", getHeader.file_name);
                    scanf("%c", buffer);
                } /* End if else */
            } /* End while */
        } /* End if */
    } /* End if */ 
4

1 に答える 1

3

単一の文字を読み取るときに改行を残すと、stdinそれを消費する必要があります。

scanf("%c", buffer);
getchar();  // consume the leftover '\n'

それを行うか、または1行だけで:

scanf(" %c", buffer); // the space will tell it to skip any "white space" characters


ここにあるコード スニペットだけでは、最初のプロンプトで無効な文字が入力された場合、elseの scanf によってスキップされたように見え (実際には、最初の残りの部分を読み取って'\n'います)、再びループして入力を取得します。

残りのコードを見なくても、おそらくこれはすべてループに入っているため、ファイルを 2 秒でスキップしています。( 'Y'、その後'\n')

于 2013-03-01T17:44:48.343 に答える