2017-06-03 43 views
-2
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代码有个疑问。为什么我应该在C代码中使用这样的getchar()?

我觉得

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

是正确的。但是,我是这样写的。我的代码不能正常工作。并重复打印出三个菜单。你能解释一下吗?我知道的是getchar可以获得字符类型所以,我应该从getchar值(在ASCII代码表之后)抽象48。

我只想知道为什么它不能正常工作。

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

我想通过使用getchar()获取值后;并设置值菜单=(getchar() - 48); 。 – Codingdumb

+0

我错了吗?..... – Codingdumb

+0

像getchar() - 48'这样的东西总是**错了! getchar是什么返回EOF?如果角色小于48,该怎么办?如果您的平台不使用ASCII编码会怎么样?你甚至读过'getchar'的文档吗? – Olaf

回答

0

你想要的代码是

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 单引号字符常量。所以编译器将用49替换'1' (假设为Ascii)。它更具可读性,更便于携带。

+1

您需要为'EOF'测试'ch',可以通过键盘发送信号,或者在发生错误时从'getchar()'返回。因为,你会有一个无限循环。 –

2

当你使用你的程序,按下选择键,,或,其次是输入。这会将两个字符放入输入缓冲区。

getchar的第一个呼叫将删除数字字符。你减去48,这是你系统上'0'的代码;在其他系统上它可能无法工作。这样做的一个可移植的方法将让编译器使用适当的数字代码'0'

menu = getchar()-'0'; 

第二getchar调用有从输入缓冲区中移除'\n'。如果您将两个电话转接,则第一个getchar将删除该数字,而第二个getchar将读取'\n'

+1

是否存在seconde getchar()来抛弃'\ n'(输入)值? – Codingdumb

相关问题