错误检入y或无应答(C)

错误检入y或无应答(C),c,C,当前代码的问题是,如果回答错误的aka答案中的第一个问题不是y或n,程序在要求重试后不会记录第二次答案 #include<stdio.h> #include<time.h> #include<string.h> void delay(unsigned int mseconds) { clock_t goal=mseconds+clock(); while(goal>clock()); } void check_anwser(char a){

当前代码的问题是,如果回答错误的aka答案中的第一个问题不是y或n,程序在要求重试后不会记录第二次答案

#include<stdio.h>
#include<time.h>
#include<string.h>

void delay(unsigned int mseconds)
{
clock_t goal=mseconds+clock();
while(goal>clock());
}

void check_anwser(char a){
    do{
        if((a=='y')||(a=='n')){
            break;
        }
        else{
            printf("\nIncorrect answer, please try again\n");
            printf(":");
            scanf("%s",&a);
            continue;
        }
    }while((a!='y')&&(a!='n'));
}

int main(){

    char start;
    int load;

    printf("************************************\n");
    printf("*Welcome to 'noname' 0.01          *\n");
    printf("*Do you want to start the game y/n?*\n");
    printf("************************************\n");

    printf(":");
    scanf("%s",&start);
    if((start!='y')&&(start!='n')){
        check_anwser(start);
    }

    if(start=='y'){
        for(load=0;load<100;load+=5){
            printf("Loading %d",load);
            delay(100);
            system("cls");
        }
    }
    else{
        printf("Shutting down");
        for(load=0;load<3;load++){
            printf(".");
            delay(600);
        }
    }
return 0;
}
#包括
#包括
#包括
无效延迟(无符号整数毫秒)
{
时钟目标=毫秒+时钟();
while(目标>时钟());
}
作废支票(字符a){
做{
如果((a=='y')| |(a=='n')){
打破
}
否则{
printf(“\n回答不正确,请重试\n”);
printf(“:”);
scanf(“%s”、&a);
继续;
}
}而((a!='y')&&(a!='n');
}
int main(){
字符启动;
整数负载;
printf(“***************************************************\n”);
printf(“*欢迎使用'noname'0.01*\n”);
printf(“*您想开始游戏吗?*\n”);
printf(“***************************************************\n”);
printf(“:”);
scanf(“%s”,开始(&s));
如果((开始!='y')&&(开始!='n')){
检查(启动);
}
如果(开始=='y'){

对于(load=0;load之所以会发生这种情况,是因为当您使用该函数检查正确答案时,用户输入的新字符没有传递给start变量。start变量中保存了旧值,因此即使用户输入了正确的值,也不会保存在任何位置,如果tement正在从具有旧值的开始变量检查

我在这里为您修复了它,下面是我在您的代码中更改的内容

之前

check_anwser(start);
现在

start = check_anwser(start);
带有更改的完整代码

#include<stdio.h>
#include<time.h>
#include<string.h>

void delay(unsigned int mseconds)
{
clock_t goal=mseconds+clock();
while(goal>clock());
}

char check_anwser(char a){
    do{
        if((a=='y')||(a=='n')){
            break;
        }
        else{
            printf("\nIncorrect answer, please try again\n");
            printf(":");
            scanf("%s",&a);

        }
    }while((a!='y')||(a!='n'));
    return a;
}


int main(){

    char start;
    int load;

    printf("************************************\n");
    printf("*Welcome to 'noname' 0.01          *\n");
    printf("*Do you want to start the game y/n?*\n");
    printf("************************************\n");

    printf(":");
    scanf("%s",&start);
    if((start!='y')&&(start!='n')){
        start = check_anwser(start);
    }

    if(start=='y'){
        for(load=0;load<100;load+=5){
            printf("Loading %d",load);
            delay(100);
            system("cls");
        }
    }
    else{
        printf("Shutting down");
        for(load=0;load<3;load++){
            printf(".");
            delay(600);
        }
    }
return 0;
}
#包括
#包括
#包括
无效延迟(无符号整数毫秒)
{
时钟目标=毫秒+时钟();
while(目标>时钟());
}
字符检查器(字符a){
做{
如果((a=='y')| |(a=='n')){
打破
}
否则{
printf(“\n回答不正确,请重试\n”);
printf(“:”);
scanf(“%s”、&a);
}
}而((a!='y')|(a!='n'));
返回a;
}
int main(){
字符启动;
整数负载;
printf(“***************************************************\n”);
printf(“*欢迎使用'noname'0.01*\n”);
printf(“*您想开始游戏吗?*\n”);
printf(“***************************************************\n”);
printf(“:”);
scanf(“%s”,开始(&s));
如果((开始!='y')&&(开始!='n')){
启动=检查(启动);
}
如果(开始=='y'){

对于(load=0;load这使用
fgets
读取选项。这样做的一个优点是,如果数组足够大,
fgets
将包含换行符。这里是
[3]的数组
仅允许为字符、换行符和
'\0'
留出空间。如果数组不包含换行符,则在
stdin
中会有更多字符等待。这有助于清除
stdin
中多余的字符。
对于延迟,使用的是
nanosleep

#include <stdio.h>
#include <string.h>
#include <time.h>

int fgetsanswer ( char *choice, FILE *fin);
void delay ( unsigned int seconds, unsigned int nseconds);

int main ( void) {

    char start;
    int load;

    printf ( "************************************\n");
    printf ( "*Welcome to 'noname' 0.01          *\n");
    printf ( "*Do you want to start the game y/n?*\n");
    printf ( "************************************\n");

    printf ( ":");
    if ( fgetsanswer ( &start, stdin)) {
        return 0;
    }

    if ( start == 'y') {
        printf ( "\rLoading  ");
        fflush ( stdout);//no trailing newline so make sure printf prints
        for ( load = 0; load <= 100; load += 5) {
            delay ( 0, 600000000);//for a 0.6 second delay
            printf ( "\rLoading %d", load);
            fflush ( stdout);//no trailing newline so make sure printf prints
        }
    }
    else {
        printf ( "Shutting down");
        fflush ( stdout);//no trailing newline so make sure printf prints
        for ( load = 0; load < 3; load++) {
            printf ( " .");
            fflush ( stdout);//no trailing newline so make sure printf prints
            delay ( 0, 700000000);//for a 0.7 second delay
        }
    }
    printf ( "\n");
    return 0;
}

void delay ( unsigned int seconds, unsigned int nseconds)
{
    struct timespec ts = {0};

    ts.tv_sec = seconds;
    ts.tv_nsec = nseconds;
    while ( nanosleep ( &ts, &ts)) {}
}

int fgetsanswer ( char *choice, FILE *fin) {
    char input[3] = "";//can hold one char a newline and a '\0'

    do {
        if ( fgets ( input, sizeof input, fin)) {
            if ( !strchr ( input, '\n')) {//is there a newline?
                while ( !strchr ( input, '\n')) {//call until newline is found to clear input
                    if ( !fgets ( input, sizeof input, fin)) {
                        fprintf ( stderr, "\nEOF problem\n");
                        return 1;
                    }
                }
                input[0] = 0;
            }
        }
        else {
            fprintf ( stderr, "\nEOF problem\n");
            *choice = 0;
            return 1;
        }
        if ( input[0] != 'y' && input[0] != 'n') {
            printf ( "\nenter y or n\n:");
            fflush ( stdout);//no trailing newline so make sure printf prints
        }
    } while ( input[0] != 'y' && input[0] != 'n');

    *choice = input[0];//assign the answer to the pointer

    return 0;
}
#包括
#包括
#包括
int fgetsanswer(字符*选项,文件*fin);
无效延迟(无符号整数秒,无符号整数秒);
内部主(空){
字符启动;
整数负载;
printf(“***************************************************\n”);
printf(“*欢迎使用'noname'0.01*\n”);
printf(“*您想开始游戏吗?*\n”);
printf(“***************************************************\n”);
printf(“:”);
if(fgetsanswer(&start,标准输入)){
返回0;
}
如果(开始='y'){
printf(“\r加载”);
fflush(stdout);//没有尾随换行符,因此请确保printf打印

对于(load=0;load注意,
clock
真的是一个糟糕的计时器。首先,不能保证单位是毫秒。其次,它在多个位置指定只计算当前进程CPU时间,而不是挂钟。第三,像您这样繁忙的等待会让处理器花费无用的CPU周期。因为
start
是一个
char
变量,您应该使用
%c
而不是
%s
。此
scanf(“%s”,&start);
-->
scanf(“%c”,&start)
@achal谢谢。但这并没有解决问题,在回答错误后,请重试…,程序将不接受y作为答案,并将直接关闭part@user3121023对阿查尔的回答也适用于你,我guess@Someprogrammerdude你有更好的建议吗?我想得到任何帮助。谢谢,正如我再次说过的,我对C和编码不感兴趣。通常,我会问,返回用户输入的新字符所需的
返回a;
的原因是什么。