我正在尝试使用嵌套的switch语句为用户编写菜单,选择一些选项。第一个开关工作正常,嵌套的开关没有。
在嵌套交换机中,我总是在default
选项中,用户无法选择。
似乎变量d
保持为NULL,这就是使交换机在默认选项中结束的原因。什么阻止用户能够键入char,并从代码中将值赋给d
?
#include<mysql.h>
#include<stdio.h>
#include<stdlib.h>
/* function declaration */
int connection_func();
int main() {
/*make connection to sql server*/
int connection_return = connection_func();
printf("%d",connection_return);
char c,d;
printf("\n Choose one of the following options: \n");
printf("1- DB maintenance \n");
printf("2- Weekly schedule creation \n");
c= getchar();
switch(c) {
case '1':
// DB maintenance
printf("\n DB maintenance options:: \n");
printf("1- ADD data to existing table \n");
printf("2- DELETE data from existing table \n");
printf("3- DISPLAY all data inside a table \n");
printf("4- DROP table (root only) \n");
d = getchar();
switch(d) {
case 'A':
// User want to ADD data to the database
break;
case 'B':
// User want to DELETE data from database
break;
case 'C':
// User want to Display the tbl data
break;
case 'D':
// User want to DROP tables
break;
default:
printf("That is not a proper selection \n");
break;
}
break;
case '2':
// Weekly schedule creation
break;
default:
printf("That is not a proper selection. \n");
break;
}
return(0);
}
int connection_func() {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server = "localhost";
char *user = "root";
char *password = "mypassword";
char *database = "sc" ;
conn = mysql_init(NULL);
/* Connect to database */
if ( !mysql_real_connect(conn, server, user, password, database, 0, NULL , 0)) {
fprintf(stderr, "%s\n", mysql_error(conn));
return(1);
}
return(0);
}
编译时没有错误。终端的输出:
root@kali:# ./sc
0
Choose one of the following options:
1- DB maintenance
2- Weekly schedule creation
1
(null) -d (**** - the value of d variable ***)
DB maintenance options::
1- ADD data to existing table
2- DELETE data from existing table
3- DISPLAY all data inside a table
4- DROP table (root only)
That is not a proper selection
答案 0 :(得分:1)
请注意,您甚至没有机会说A
或B
。
按1
后,按Enter
。 1
进入c
,d = getchar()
导致d
拥有换行符代码。
答案 1 :(得分:0)
当您输入&#34; 1&#34;时,您实际上为您的程序提供了两个字符,一个&#34; 1&#34;然后,输入(在stdin上显示为换行符)。
然后通过第二次调用d = getchar()
返回换行符。 (您可以输入两个选项以查看您的程序是否正常工作:例如12后跟ENTER)。
如果您想跳过空格,例如换行符,制表符和空格,建议您使用scanf(" %c", &d)
。初始空格告诉scanf
在转换单个字符之前跳过任何数量的空格。请务必检查scanf
是否返回1,表示已成功将项目转换为扫描。
答案 2 :(得分:0)
插入“1”并单击“输入”后,stdin流中包含“1 \ n”, 然后调用getchar()一次,从stdin中删除“1”。
然后,下一次调用getchar()不会提示用户,因为stdin流中已有数据 - 换行符'\ n'。
尝试使用
while((d = getchar()) != '\n' && d != EOF);
将无用的数据分解出来,直到换行,通常它只是'\ n'字符,所以你甚至可以再次使用execute来调用getchar()来从流中删除换行符。 / p>
另外,正如其他评论所述,我会考虑fgets