C 为什么这个循环要运行两次?

C 为什么这个循环要运行两次?,c,function,linked-list,C,Function,Linked List,这个函数应该在connect 4游戏中返回1步,但是,它返回两次。。。我用调试器检查了这个函数,它似乎跳过了getc()调用,我不知道为什么。非常感谢您的帮助 char UndoBoard(char x[ROWS][COLS], char * player){ struct Node* temp = head; int i,j; temp = temp->next; char input = 'q'; while((input != 'q' || i

这个函数应该在connect 4游戏中返回1步,但是,它返回两次。。。我用调试器检查了这个函数,它似乎跳过了getc()调用,我不知道为什么。非常感谢您的帮助

char UndoBoard(char x[ROWS][COLS], char * player){
    struct Node* temp = head;
    int i,j;
    temp = temp->next;
    char input = 'q';
    while((input != 'q' || input != 'Q') && temp != NULL){
        for (i=0;i<ROWS;i++){
            for (j=0;j<COLS;j++){
            x[i][j] = temp->data[i][j];
            }
        }
        printBoard(x);
        if(*player == 'O')*player = 'X';
        else *player = 'O';
        printf("b - undo one step more, f - go forward, q - resume game from here\n");
        input = getc(stdin);
        if(input == 'q' || input == 'Q')break;
        temp = temp -> next;
    }
}
char撤消板(char x[行][COLS],char*player){
结构节点*温度=头部;
int i,j;
温度=温度->下一步;
字符输入='q';
while((输入!='q'| |输入!='q')&&temp!=NULL){
对于(i=0;i下一步;
}
}
中使用的逻辑

while((input != 'q' || input != 'Q') && temp != NULL){
存在故障。您需要使用:

while((input != 'q' && input != 'Q') && temp != NULL){
逻辑

while((input != 'q' || input != 'Q') && temp != NULL){
存在故障。您需要使用:

while((input != 'q' && input != 'Q') && temp != NULL){

您在
while
条件中的
input
条件是错误的。无论
input
的值是多少,这两个条件中的一个将为true,因此循环仅在
temp!=NULL
时终止

但实际上,在用户输入后,您可以使用正确的表达式在循环中中断,因此实际上不需要在循环条件下进行测试。相反,在此处仅使用
temp

while ( temp != NULL ) {
现在你也可以改变了

char input = 'q';

因为现在不是在循环中读取用户输入之前

请注意,
getc
返回一个
int
,而不是一个
char
,要提供
EOF
,您还应该测试(感谢@chux为我指出这一点)

由于您只是在循环中使用它,因此可以将其移动到(包括所有更改):


您在
while
条件中的
input
条件是错误的。无论
input
的值是多少,这两个条件中的一个将为true,因此循环仅在
temp!=NULL
时终止

但实际上,在用户输入后,您可以使用正确的表达式在循环中中断,因此实际上不需要在循环条件下进行测试。相反,在此处仅使用
temp

while ( temp != NULL ) {
现在你也可以改变了

char input = 'q';

因为现在不是在循环中读取用户输入之前

请注意,
getc
返回一个
int
,而不是一个
char
,要提供
EOF
,您还应该测试(感谢@chux为我指出这一点)

由于您只是在循环中使用它,因此可以将其移动到(包括所有更改):



当你解决这个问题时,多余的括号可以被删除。@BobbyJack,不过,为了可读性,这更多是个人的事情。如果这有助于编码者,那么让他们习惯于误用
&&
|
。这种情况比人们愿意承认的要多。进行这种修改将导致循环永远不会执行,除非input被初始化为“q”以外的值。@MComp你的条件
input!='q'| | input!='q'
总是
true
,当你解决这个问题时,多余的括号可以被删除。@BobbyJack不过,这更像是个人的可读性问题。如果它对编码者有帮助,那么就让他们习惯于误用
&
,并且
| |
。这种情况比人们愿意承认的要多。进行这种修改将导致循环永远不会执行,除非输入被初始化为“q”以外的值。MComp您的条件
input!=“q”| input!=“q”
始终是
真的。在这种情况下,您至少需要运行一次循环,最好使用
do{}while(condition)
构造。在您的例子中,它将是
do{}while(input!='q'&&input!='q'&&temp!=NULL)
,或者
do{}while(!(input='q'| input='q'| temp==NULL))
@alvits:不太可能,因为在检查输入之前检查了
temp!=NULL
,在检查输入之后必须做一些事情。因此,它应该是
while(temp!=NULL).
。输入代码已经导致
中断
@Olaf-这是真的,但是我指的是关于何时使用
do的一般构造{…}while(condition)
construct。但是你是对的,我错过了OPs代码中的一行,当
input
q
q
@alvits时,
temp=temp->next;
,这使得
循环无用:-)是的,因为
input
在获取后立即被检查。在这种情况下,您需要至少运行一次循环,最好使用
do{}while(条件)
构造。在您的情况下,它将是
do{…}while(input!=“q'&&input!=“q'&&temp!=NULL)
,或者
do{…}while(!(input='q'| | input='q'| | temp==NULL))
@alvits:不太可能,因为在检查输入之前检查了
temp!=NULL,在检查输入之后必须做些什么。因此,在(temp!=NULL)时应该是
。输入代码已经导致
中断
@Olaf-这是正确的,但是我指的是何时使用
do{…}while(条件)的一般构造
construct。但是你是对的,我错过了OPs代码中的一行,当
input
q
q
@alvits时,
temp=temp->next;
会中断
,这使得
循环无用:-)是的,因为
input
在获得后立即被检查。很好的简化。小
int-input;…如果(input='q'| | input='q'| input==EOF)
Nice简化。小
int-input;…如果(input='q'| input='q'| input==EOF)