if else语句双重打印C.

时间:2014-04-05 21:32:34

标签: c if-statement do-while

我正在编写一个程序,为C文件添加行号。我得到文件名作为命令行参数但我希望用户有机会输入它们,如果他们忘记了他们运行程序时。我问用户他们是否要输入文件名,然后他们回答'y'或'n'。如果输入了无效字符,则会有五次尝试正确回答,但在五次尝试后,程序会输出错误消息并终止。如果用户输入无效字符,我打印'[y / n]?'到屏幕提示用户输入那些字母。如果输入了无效字符虽然它经过两次循环并将它们并排打印出来。为什么会这样?

Compiler.c文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lineNumAdderHeader.h"
#include "miscellaneousHeader.h"
#include "errorCheckedFunctionsHeader.h"

int main(int argc, char *argv[]){
int i = 1;
char ch;
int answerTries = 0;
char *seperatedFilenames[argc - 1];

if (argc < 2){
    fprintf(stderr, "No files were entered for compiling.\n");

    answer: do{
        if (answerTries == 0)
            printf("Would you like to enter files for compiling [y/n]? ");
        else if (!(answerTries < 5))
             fatal("in main(). An invalid character was entered too many times.");
        else
            printf("[y/n]? ");

        ch = getchar();

        if (ch == 'n' || ch == 'N')
            exit(0);

        answerTries++;
    } while (ch != 'y' && ch != 'Y');
}
else{
    while (i < argc){
        seperatedFilenames[i - 1] = argv[i];
        i++;
    }
}

i = 0;
while (i < (argc - 1)){
    lineNumAdder(seperatedFilenames[i]);
    i++;
}
}

致命功能:

/*Displays a fatal error*/
void fatal(char *errorMessage){
/*Holds the errorMessage*/
char completedErrorMessage[strlen(errorMessage) + 17];

/*Copies the error message into completedErrorMessage*/
strcpy(completedErrorMessage, "[!!] Fatal Error ");
strcat(completedErrorMessage, errorMessage);

/*Prints the error message to the screen*/
fprintf(stderr, "%s\n", completedErrorMessage);

/*Exit the program in failure*/
exit(-1);
}

2 个答案:

答案 0 :(得分:0)

您的getchar()调用会从标准输入中返回一个字符。当用户输入答案时,他会点击一个输入/返回键,该键转换为新行字符,该字符行将被发送到标准输入行。

你应该做的只是检查getchar返回的第一个字符,然后循环读取并丢弃所有字符,直到你得到换行符(\n)。只有这样,你才能再次提出问题。

您应该使用此循环,因为您的用户可以一次输入多个字符。例如,他可以输入“是”,这将计为4个字符。

答案 1 :(得分:-1)

尝试使用

在完成循环之前刷新流
fflush(stdin);

如果您不想使用此功能,可以试试这个,

do{
    if(answerTries!=0)  //it should clear your newline char input
         getchar();
    if (answerTries == 0)
        printf("Would you like to enter files for compiling [y/n]? ");
    else if (!(answerTries < 5))
         fatal("in main(). An invalid character was entered too many times.");
    else
        printf("[y/n]? ");

    ch = getchar();

    if (ch == 'n' || ch == 'N')
        exit(0);

    answerTries++;
} while (ch != 'y' && ch != 'Y');

希望它有所帮助......