为什么第二次getchar()调用总是触发我的switch的默认情况?

时间:2015-12-17 19:59:13

标签: c getchar

我正在尝试使用嵌套的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 

3 个答案:

答案 0 :(得分:1)

请注意,您甚至没有机会说AB

1后,按Enter1进入cd = 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