为什么要在 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);
使用程序时,按选择键1、2或3,然后按 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)。它更具可读性和便携性。
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);
使用程序时,按选择键1、2或3,然后按 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)。它更具可读性和便携性。