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

Why should I use getchar() like this in C code?

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 代码 TABLE )。

我只是想知道为什么效果不好。

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

使用程序时,按选择键123,然后按 Enter。这会将两个字符放入输入缓冲区。

getchar 的第一次调用删除了数字字符。您减去 48,这是您系统上 '0' 的代码;在其他系统上它可能不起作用。一种可移植的方法是让编译器为 '0':

使用适当的数字代码
menu = getchar()-'0';

第二个 getchar 调用用于从输入缓冲区中删除 '\n'。如果你调换这两个调用,第一个 getchar 将删除数字,第二个 getchar 将读取 '\n'.

您要的密码是

int menu = getchar();
int ch;
/* horrid looking, but "eat" the rest of the line user input */
while( (ch = getchar()) != '\n')
   continue;

switch(menu)
{
   case '1':
     /* handle menu item 1 */
     break;
   case '2':
      /* handle menu item 2 */
      break;
   default:
      /* unsupported menu entry, handle it */
}

无需减去 48 即可使菜单进入 0 到 9 的范围。 单引号是字符常量。所以编译器将替换'1' 49(假设 Ascii)。它更具可读性和便携性。