Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确使用scanf和char?_C_Char_Scanf_Do While - Fatal编程技术网

如何正确使用scanf和char?

如何正确使用scanf和char?,c,char,scanf,do-while,C,Char,Scanf,Do While,这是一个简单的代码,可以打印6个数字,然后询问用户是否要继续,但在某些情况下,我的继续标志的值会发生变化。有什么想法吗? do while块末尾的while是否只接受一个条件 代码如下: void x(){ int i = 1, cont = 0; char flag; do{ if(cont == 6 && (flag != 'n' || flag != 'N')){ printf("(S/N)");

这是一个简单的代码,可以打印6个数字,然后询问用户是否要继续,但在某些情况下,我的继续标志的值会发生变化。有什么想法吗? do while块末尾的while是否只接受一个条件

代码如下:

void x(){
    int i = 1, cont = 0;
    char flag;

    do{
        if(cont == 6 && (flag != 'n' || flag != 'N')){
            printf("(S/N)");
            scanf("%c", &flag);
            printf("\n :%c \n", flag);
            if(flag == 's' || flag == 'S'){
                cont = 0;
                printf("\n");
            }
        }else{
            printf("%d, ", i);
            i++;
            cont++;
        }
    }while(flag != 'n' || flag != 'N');
}
你必须更换

 scanf("%c", &flag);

为避免扫描空白族[此处为上次按ENTER键时存储在输入缓冲区中的
\n
]

接下来,你必须重新思考逻辑。我不明白再次检查输入的目的是什么。嗯,没必要。如果我正确理解了您的目的,您可以像下面这样重新编写代码

#include <stdio.h>
#include <stdlib.h>

int main(){
    int i = 1, cont = 0;
    char flag;

    do{
        if(cont == 6 && (flag != 'n' || flag != 'N')){
            printf("(Y/N)");
            scanf(" %c", &flag);               //ignore whilespace-family
            printf("\n :%c \n", flag);
            if(flag == 'y' || flag == 'Y')     // check for Y or y and continue the next set to print
            {
                cont = 0;
                printf("\n");
            }
            else if (flag == 'n' || flag == 'N')   // check for n or N and break out of loop
                break;
            else
                printf("Invalid choice\n");        // ask the input again
        }else{
            printf("%d, ", i);
            i++;
            cont++;
        }
    }while(1);                                     // infinite loop
}
#包括
#包括
int main(){
int i=1,cont=0;
字符标志;
做{
如果(cont==6&&(flag!='n'| | flag!='n')){
printf(是/否);
scanf(“%c”,&flag);//忽略whilespace族
printf(“\n:%c\n”,标志);
if(flag='y'| | flag='y')//检查y或y并继续下一组打印
{
cont=0;
printf(“\n”);
}
else if(flag='n'| | flag='n')//检查n或n并中断循环
打破
其他的
printf(“无效选择\n”);//再次询问输入
}否则{
printf(“%d”,i);
i++;
cont++;
}
}while(1);//无限循环
}

第一次输入
标志后,还可以在stdin缓冲区中输入
\n
字符。这导致了问题。如果返回
,则应测试
scanf
返回值和
break
,如果返回
!=1
#include <stdio.h>
#include <stdlib.h>

int main(){
    int i = 1, cont = 0;
    char flag;

    do{
        if(cont == 6 && (flag != 'n' || flag != 'N')){
            printf("(Y/N)");
            scanf(" %c", &flag);               //ignore whilespace-family
            printf("\n :%c \n", flag);
            if(flag == 'y' || flag == 'Y')     // check for Y or y and continue the next set to print
            {
                cont = 0;
                printf("\n");
            }
            else if (flag == 'n' || flag == 'N')   // check for n or N and break out of loop
                break;
            else
                printf("Invalid choice\n");        // ask the input again
        }else{
            printf("%d, ", i);
            i++;
            cont++;
        }
    }while(1);                                     // infinite loop
}