1

我正在研究处理覆盖目录中文件的程序的一部分。覆盖文件很容易......但显然不会提示用户是否希望覆盖文件。例如:如果我想覆盖两个文件(fileOne.txt、fileTwo.txt),我需要提示用户两次(每个文件一次)。在我当前的提示下,如果我提示用户覆盖 fileOne.txt,fileOne.txt 和 fileTwo.txt 都将被覆盖。如果有两个以上的文件要覆盖,它将只覆盖两个连续的文件。我相信这与点击“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'

会这样做,或者只是单行:

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


仅使用您在此处的代码片段,如果在第一个提示符处输入了无效字符,它似乎会被else's scanf 跳过(实际上它正在读取第一个 leftover '\n')并且它将再次循环以获取输入。

在没有看到其余代码的情况下,大概您将所有这些都放在一个循环中,这就是它在 2 秒内跳过文件的原因。( 'Y', 那么'\n')

于 2013-03-01T17:44:48.343 回答