为什么我要在C代码中使用这样的getchar()?

时间:2017-06-03 12:36:06

标签: c getchar

while(1) {
    printf("1. ADD\n2. VIEW LIST\n3. QUIT\n");
    int menu = 0 ;
    menu = getchar()-48;
    getchar();
    switch(menu) {
        case 1:
            addition(book,count++); break;
        case 2:
            viewList(book); break;
        case 3:
            return 0;
    }
}

我只是尝试做我的练习代码。但是,我对这个C代码有疑问。

我认为

getchar();
menu = (getchar()-48); 

是对的。但是,我写的是这样的。我的代码运作不好。然后重复打印出三个菜单。你能解释一下吗?我所知道的是getchar可以获得Character类型所以,我应该从getchar值抽象48(遵循ASCII CODE TABLE)。

我只是想知道它为什么不能很好地运作。

getchar();
menu = (getchar()-48); 

2 个答案:

答案 0 :(得分:2)

当您使用程序时,按下选择键 1 2 3 ,然后按 Enter 。这会将两个字符放入输入缓冲区。

getchar的第一次调用会删除数字字符。您减去48,这是您系统上'0'的代码;在其他系统上它可能无法正常工作。一种可移植的方法是让编译器使用'0'的适当数字代码:

menu = getchar()-'0';

第二个getchar调用用于从输入缓冲区中删除'\n'。如果您切换两个电话,第一个getchar将丢弃该数字,第二个getchar将读取'\n'

答案 1 :(得分:0)

您想要的代码是

set.seed(12345)
library(nnet)
df$highest_purchase_freq <- apply(df[2:4], 1, which.is.max)-1
df  

  customer A B C highest_purchase_freq
1        1 2 3 4                     2
2        2 4 6 5                     1
3        3 4 2 4                     2
4        4 4 2 4                     2
5        5 4 4 4                     2
6        6 2 2 2                     2
7        7 4 4 4                     1

无需减去48即可将菜单放入0到9的范围内。 单引号是字符常量。所以编译器将取代&#39; 1&#39; 到49(假设Ascii)。它更具可读性和便携性。