我正在编写一个程序,为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);
}
答案 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');
希望它有所帮助......