错误检入y或无应答(C)
当前代码的问题是,如果回答错误的aka答案中的第一个问题不是y或n,程序在要求重试后不会记录第二次答案错误检入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){
#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;
的原因是什么。