LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 971|回复: 17

ascii 的问题。

[复制链接]
发表于 2003-9-18 11:28:25 | 显示全部楼层 |阅读模式
我下面的想法不知道对不对?
在C++中,若想接受键盘输入,将其值赋予一个变量,有的键可以对应多种类型的变量,如A,3; 有的键只能对应一种类型的变量,如ESC,DEL;有的键则不能对应任何一种类型的变量,如CTRL,ALT。

另外的一个问题:

  1. #include<iostream>
  2. using namespace std;
  3. int main ()
  4. {
  5.    char c1, c2;
  6.    cout<<"press a key, maybe ESCAPE:"<<endl;
  7.    cin>>c1;
  8.    cout<<(char(27)==c1)<<endl;
  9.    cout<<"press another key, maybe TAB:"<<endl;
  10.    cin>>c2;
  11.    cout<<(char(9)==c2)<<endl;
  12. }
复制代码


当我按ESC键时,输出1; 我想,接下来,若按TAB键,也应该输出1,可以当我按TAB键后,
程序无法结束,为什么?
谢谢。
发表于 2003-9-18 12:04:35 | 显示全部楼层
因为cin把tab过滤掉了,你输入一堆tab和空格,在输入一个'a',最后c2就是'a'
 楼主| 发表于 2003-9-18 13:08:50 | 显示全部楼层
你的意思是不是说按TAB键之后,再按别的键,例如A,cin就会接受A,忽略TAB?
可我按TAB之后,便回车了,没按别的键呀,
输入ESC给c1时,也是ESC,然后回车,输出就是1了,
为什么?
谢谢。
"你输入一堆tab和空格,在输入一个'a',最后c2就是'a'"
这样的话,程序也应该输出0,然后退出,可以程序却无法退出。
发表于 2003-9-18 13:26:35 | 显示全部楼层
cin输入的时候过滤掉了tab,你按tab回车就等于没输入,必须等到不是tab和空格的输入才行,你按空格、回车一样也没输入,就和直接回车一样。

这就和C里的scanf一样,scanf("%d%d", &a, &b);可以输入两个数回车,也可以输入一个数回车,再输入第二个,这中间加几个空格、tab、回车都可以。
 楼主| 发表于 2003-9-18 14:19:16 | 显示全部楼层
我不太懂C,不过听你刚才这么说,我似乎明白一点了。
也许你的意思是说TAB键是无法用cin获取的,是个特殊的键,
当然SPACE不在ASCII中,如果在的话,同样无法用cin获取。
即便如此TAB的值仍是ch(9).
发表于 2003-9-18 15:35:38 | 显示全部楼层
CTRL,ALT
这些键如果在windows中要使用getch()得到

在linux下要设置成原始模式后才能读到tcsetattr)
通常情况下控制台已经对它们进行了解释 而不会传给应用程序
发表于 2003-9-18 16:56:51 | 显示全部楼层
cin实际取得了tab和空格,但是都被过滤掉了,cin不返回tab和空格,
比如用字符串:

  1. #include <iostream>
  2. #include <string>

  3. using namespace std;

  4. int
  5. main ()
  6. {
  7.   string s;
  8.   cin >> s;
  9.   cout << "s:" << s << "..\n";
  10. }
复制代码

你输入的字符串周围不管有多少空格和tab都和什么都没有一样。
 楼主| 发表于 2003-9-18 19:39:42 | 显示全部楼层
谢谢。

  1. #include<iostream>
  2. using namespace std;
  3. int main ()
  4. {
  5.    while (!cin.eof())
  6.       cout<<"character code"<<cin.get()<<endl;
  7.    return 0;
  8. }
复制代码

用这个程序可以得到ASCII中的不可打印的控制符,
不过有些不正确,比如DEL,本来应该是ch(127),但是输出的却是51, 91, 126.
为什么?
发表于 2003-9-18 20:38:21 | 显示全部楼层
这个是终端控制码,和C++没什么关系,要了解的话得看看终端编程的内容,
我的del是^[[3~
^[ 27 就是ESC
[  91
3  51
~  126
 楼主| 发表于 2003-9-18 20:51:53 | 显示全部楼层
哦,也就是说不在shell中便不一定会出现这种问题喽?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表