if-else语句双打印C

if-else语句双打印C,c,if-statement,do-while,C,If Statement,Do While,我正在编写一个程序,将行号添加到C文件中。我将文件名作为命令行参数,但我希望用户在运行程序时忘记输入文件名时有机会输入。我要求用户输入文件名,然后回答“y”或“n”。如果输入了无效字符,他们将有五次尝试正确回答,但五次尝试后,程序将打印错误消息并终止。如果用户输入无效字符,我会将“[y/n]”打印到屏幕上,以提示用户输入这些字母。如果输入了无效字符,尽管它经过循环两次并并排打印出来。为什么会发生这种情况 编译器.c文件: #include <stdio.h> #include <

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

编译器.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++;
}
}

在完成循环之前,尝试用

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');
do{
if(answertryties!=0)//应该清除换行符输入
getchar();
如果(回答==0)
printf(“是否要输入用于编译的文件[y/n]?”;
否则如果(!(回答<5))
致命(“在main()中,输入无效字符的次数太多。”);
其他的
printf(“[y/n]?”);
ch=getchar();
如果(ch='n'| ch='n')
出口(0);
回答++;
}while(ch!=“y”&&ch!=“y”);
希望有帮助。

您的
getchar()
调用从标准输入返回一个字符。当用户输入答案时,他点击回车键,该键转换为新行字符,新行字符是该行的一部分,然后发送到标准输入

您可能应该只检查
getchar
返回的第一个字符,然后在循环中读取并丢弃所有字符,直到获得新行字符(
\n
)。只有这样,你才能在另一个时间继续问这个问题


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

如果在Unix/Linux上,
cat-n您的文件在这里运行良好。
顺便说一句,“[!!]致命错误”长度为17,
char completedErrorMessage[strlen(errorMessage)+17]没有足够的大小。@BLUEPIXY是对的,但从他的推荐中不清楚他是指您没有空间来尾随字符串结尾“\0”。
fflush(stdin)
是未定义的行为,但实际上,如果您幸运的话,它什么也做不了。O我从来都不知道这个函数的正确原型??:(但为什么它总是对我有效?@debu-rider
fflush(stdin)
仍然匹配
fflush
原型,所以它不会生成编译错误。“未定义的行为”这意味着任何事情都有可能发生。也许它会以一种你认为正常的方式运行。不过,你永远不应该依赖它。@deb_rider:这就是未定义行为的美妙之处:)顺便说一句,函数的原型与此无关。C++和C是不同的语言,所以我将参考C99标准:<代码>如果流指向输出流或更新流,在其中最新的操作没有被输入,FFLUW函数导致该流的任何未写入数据被传递到主机环境,以写入文件;否则,行为是未定义的。
因此,尽管类似,C定义有点不同-它允许
指向输入,但将行为定义为未定义。任何情况都可能发生。在这种情况下,操作是由处理系统定义的。用户不必按enter键获取getchar()。它在输入一个字符后立即读取输入。他们没有机会输入更多字符。@user3273091:这取决于程序将运行的终端类型。我知道的大多数终端都是在所谓的“规范”模式下配置的,这简化了事情,意味着输入将以行的形式发送,而不是使用单个字符。但是,您可以使用
stty-icanon
禁用此行为。那么你在什么样的终端上运行你的程序呢?我在bash终端上运行它。然而,我希望该程序能够在任何计算机上运行OS@user3273091:Bash不是终端,而是shell。终端是一个运行shell的程序。无论如何,要想知道从
getchar()
中得到的第二个字符是什么,最简单的方法就是用两个可打印的字符(例如
printf(“#%c#\n”,ch)
)括起来打印。我一直缺少它,因为这是一种习惯,但我确实为getchar()按了enter键。它是额外的\n字符。我将按照上面的建议执行,循环并丢弃所有额外的字符。谢谢你在这件事上对我耐心。
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');