我正在C上建立一个测验项目。我的问题是,我可以使用命令或使用某些东西让用户决定是否继续回答问题。例如,这是我的代码的一部分。我想让用户能够按“0”,只要用户按下该按钮或键入它,程序就会停止。我正在考虑使用循环,但我想知道是否有任何方式让用户按下按钮或键入一些东西来结束它,只要他想要。 Thansk为你的时间而抱歉我的英语和混乱。
#include <stdio.h>
int main()
{
int a, ep;
int score;
score = 0;
printf("Choose one\n");
printf(" 1. Athletics\t 2. History\t\n 3. Internet\t 4. Greek Mythologyn\n");
printf("Pick: ");
scanf("%d",&ep);
if (ep==1) {
printf("\n");
printf("1. Ποιος διεθνής Έλληνας σκόραρε πάνω από ένα γκολ στο Μουντιάλ 2014;\n");
printf(" 1. Παπασταθόπουλος\n 2. Σάμαρης\n 3. Σαμαράς\n 4. Κανένας\n");
printf("Answer: " );
scanf("%d",&a);
if (a==4) {
printf("Correct!!!\n");
score = score +1;
}
else {
printf("Wrong\n");
score = score -1;
}
printf("Your score is: %d\n\n\n",score);
printf("2. Ποιος κέρδισε τον δεύτερο απο τους πέντε τελικούς της σειράς για την Α1 τη\nσεζόν 2013-14;\n");
printf(" 1. Ολυμπιακός\n 2. Παναθηναϊκός\n");
printf("Answer: " );
scanf("%d",&a);
if (a==1) {
printf("Correct!!!\n");
score = score +1;
}
else {
printf("Wrong\n");
score = score -1;
}
printf("Your score is: %d\n\n\n",score);
答案 0 :(得分:2)
我想知道无论如何都要让用户按下按钮或输入内容以便随时结束。
就在这里。但首先虽然scanf()
是在控制台应用程序中获取用户输入的好方法,例如在示例代码中,但应注意避免缓冲区溢出,不需要的空白等。以下链接解决了这些问题。其他相关问题。
有关 sscanf(...) 及其格式字符串的有趣讨论:
关于控制台用户输入的好方法:
建议:
在永久循环中使用简单的字符值测试。这个片段说明了一种技术的基本要素,可以在用户输入期间使用这种技术来留下循环或留在:
int main()
{
char c[10];
char go[10];
//Place the rest of your variable declarations and initializations here
for(;;)
{
c[0]=0;
//...
//The bulk of your code here...
//...
//Place this section at the bottom of your questions:
printf("enter q to exit, or <enter> to continue\n");
fgets(c, sizeof(c), stdin);//reads string input from stdin
sscanf(c, " %9s", go);//string 'c' is evaluated according to the
//contents of the format string: " %9s"
//and parsed into the buffer 'go'.
//
//Note the space in the format string just
//prior to %9s. It causes any white space,
//including the newline character, \n, to
//be consumed, effectively removing it from
//being written into the 'go' buffer.
//
//The '9' in " %9s" prevents user input beyond
//9 characters to be read into the buffer,
//thus preventing buffer overflow
//and allows room for NULL termination.
if(strstr(go, "q")) break;//if 'q' is in string 'go' exit loop
//...
}
return 0;
}
基于原始构造的代码的完整版本,主要使用sequential flow
和if(.){...}else(.){...}
语句(包括演示链接中讨论的方法的编辑)如下所示。通过使用链接中讨论的概念,执行流程比原始流程得到改进。它会提示用户进行测试,提示问题的答案,最后提供退出选项。
注意,这些编辑提供了用户选项,仅在测试结束时退出。底部有一个版本,显示其他构造选项,包括在程序中的任何位置离开的能力。
请注意注释以指明更改的位置:
int main()
{
char c[10]; ///added
char go[10]; ///added
int a, ep;
int score;
score = 0;
for(;;) ///added
{ ///added
printf("Choose one\n");
printf(" 1. Athletics\t 2. History\t\n 3. Internet\t 4. Greek Mythologyn\n");
printf("Pick: ");
fgets(c, sizeof(c), stdin); //edited
sscanf(c, " %d",&ep); //edited
if (ep==1)
{
printf("\n");
printf("1. Ποιος διεθνής Έλληνας σκόραρε πάνω από ένα γκολ στο Μουντιάλ 2014;\n");
printf(" 1. Παπασταθόπουλος\n 2. Σάμαρης\n 3. Σαμαράς\n 4. Κανένας\n");
printf("Answer: " );
fgets(c, sizeof(c), stdin); //edited
sscanf(c, " %d",&a); //edited
if (a==4)
{
printf("Correct!!!\n");
score = score +1;
}
else
{
printf("Wrong\n");
score = score -1;
}
printf("Your score is: %d\n\n\n",score);
printf("2. Ποιος κέρδισε τον δεύτερο απο τους πέντε τελικούς της σειράς για την Α1 τη\nσεζόν 2013-14;\n");
printf(" 1. Ολυμπιακός\n 2. Παναθηναϊκός\n");
printf("Answer: " );
fgets(c, sizeof(c), stdin); //edited
sscanf(c, " %d",&a); //edited
if (a==1)
{
printf("Correct!!!\n");
score = score +1;
}
else
{
printf("Wrong\n");
score = score -1;
}
printf("Your score is: %d\n\n\n",score);
} ///added
printf("enter q to exit, or c to continue\n"); //added
fgets(c, sizeof(c), stdin); //added
sscanf(c, " %9s", go); //added - note space
//in format string
//to consume \n
//character if there
if(strstr(go, "q")) break; //added
}
return 0;
}
替代结构:
C switch() {...}; statement 和 ternary operator 。构造用作提高可读性的选项。
int main()
{
char c[10];
char go[10];
int a, ep;
int score;
score = 0;
for(;;)
{
printf("Categories:\n\n");
printf(" 1. Athletics\t 2. History\t\n 3. Internet\t 4. Greek Mythology\n\n");
printf("Choose a category (or 'q' to exit) : ");
fgets(c, sizeof(c), stdin); //edited
(isalpha(c[0])) ?
(sscanf(c, " %9s",go), ep=0) :
(sscanf(c, " %d",&ep), go[0]=0); //using ternary operator -> ?:
if(strstr(go, "q")) break;
switch(ep) {
case 1:
// questions for First category
printf("Make selection: (or 'q' to exit)\n");
printf("1. Ποιος διεθνής Έλληνας σκόραρε πάνω από ένα γκολ στο Μουντιάλ 2014;\n");
printf(" 1. Παπασταθόπουλος\n 2. Σάμαρης\n 3. Σαμαράς\n 4. Κανένας\n");
printf("Answer: " );
fgets(c, sizeof(c), stdin); //edited
(isalpha(c[0])) ?
(sscanf(c, " %9s",go), a=0) :
(sscanf(c, " %d",&a), go[0]=0); //using ternary operator -> ?:
if(strstr(go, "q")) break;
if (a==4)
{
printf("Correct!!!\n");
score = score +1;
}
else
{
printf("Wrong\n");
score = score -1;
}
printf("Your score is: %d\n\n\n",score);
printf("2. Ποιος κέρδισε τον δεύτερο απο τους πέντε τελικούς της σειράς για την Α1 τη\nσεζόν 2013-14;\n");
printf(" 1. Ολυμπιακός\n 2. Παναθηναϊκός\n");
printf("Answer: " );
fgets(c, sizeof(c), stdin); //edited
(isalpha(c[0])) ?
(sscanf(c, " %9s",go), a=0) :
(sscanf(c, " %d",&a), go[0]=0); //using ternary operator -> ?:
if(strstr(go, "q")) break;
if (a==1)
{
printf("Correct!!!\n");
score = score +1;
}
else
{
printf("Wrong\n");
score = score -1;
}
printf("Your score is: %d\n\n\n",score);
break;
case 2:
// questions for second category
break;
case 3:
// questions for third category
break;
case 4:
// questions for forth category
break;
default:
printf("Wrong selection. Try again. (1 - 4)\n");
break;
}
printf("\n\nenter q to exit, or c to continue\n");
fgets(c, sizeof(c), stdin);
sscanf(c, " %9s", go);
if(strstr(go, "q")) break;
}
return 0;
}
答案 1 :(得分:2)
您可以使用的一个简单的事情是ktbit
功能。该功能检查用户是否点击了按钮。
示例:强>
int direction = 1; char control;
while (1)
{
if(kbhit()){
control = getchar();
switch (control){
case 'x': return 0;
}
}
}
同样在beginnig中,您需要添加#include <conio.h>