zoukankan      html  css  js  c++  java
  • 第5讲——cin处理字符输入

    本来这一讲应该是while、for、if之类的,但是,我们可是学过C的男人,再浪费时间搞这个???

    还不如学点C++中的新知识。

    cin对象支持3种不同模式的单字符输入,其用户接口各不相同。

    下面我们在while循环中进行这三种模式的讲解。

    【第一种】:使用原始的cin进行输入

    //使用循环来读取来自键盘的文本输入
    //使用字符'#'作为停止标记 
    char ch;
    cin>>ch;
    while(ch != '#'){ 
    	...
    	cin>>ch;
    }
    

    注意:cin读取char值时,与读取其他基本类型一样,将忽略空格和换行符。因此输入中的空格没有被回显,也没有被包括在计数内。

    有一点复杂的是,发送给cin的输入被缓冲。这意味着只有在用户按下回车键后,他输入的内容才会被发给程序。这就是在运行该程序时,可以在#后面输入字符的原因。按下回车键后,整个字符序列将被发送给程序,但程序在遇到#字符后将结束对输入的处理。

    【第二种】:使用cin.get(char)进行补救

    然而,我们若是需要检查包括空格、制表符和换行符之内的所有字符,那么就不能用原始的cin输入了。

    cin所属的istream类(在iostream中定义)中包含一个能够满足这种要求的成员函数。具体地说,成员函数cin.get(ch)读取输入中的下一个字符(即使它是空格),并将其赋给变量ch。

    char ch;
    cin.get(ch);	 
    while(ch != '#'){ 
    	...
    	cin.get(ch);
    }
    

    这个程序回显了每个字符,并将全部字符计算在内,其中包括空格。

    面对这段程序,我们会疑惑:cin.get(ch)调用将一个值放在ch变量中,这意味着将修改该变量的值。然而我们在C语言的时候,要修改变量的值,必须将变量的地址传递给函数。但上段程序中调用cin.get()时,传递的是ch,而不是&ch。

    的确,这样的代码在C语言中无效,但在C++中却有效,只要函数将参数声明为引用即可。头文件 iostream将cin.get(ch)的参数声明为引用类型,因此该函数可以修改其参数的值。

    【第三种】不带参数的cin.get()

    我们知道在C语言时,我们使用的字符I/O函数是getchar()和putchar(),在C++中,我们可以看看这种方式:

    不接受任何参数的cin.get()成员函数返回输入中的下一个字符,即可以这样使用:

    ch=cin.get(); 
    

    该函数的工作方式与C语言中的getchar()相似,将字符编码作为int值返回;而cin.get(ch)返回一个对象,而不是读取的字符。同样,可以使用cout.put()函数来显示字符:

    cout.put(ch);
    

    该函数的工作方式类似C语言中的putchar(),只不过其参数类型为char,而不是int。

    注意,put()成员只有一个原型——put(char) 。可以传一个int参数给它,该参数将被强制转换为char。

    为成功地使用cin.get(),需要知道其如何处理EOF条件。当该函数到达EOF时,将没有可返回的字符。相反,cin.get()将返回一个用符号常量EOF表示的特殊值。该常量是在头文件iostream中定义的。EOF的值必须不同于任何有效的字符值,以便程序不会将EOF与常规字符混淆。通常,EOF被定义为值-1,因为ASCII码为-1的字符,但并不需要知道实际的值,而只需在程序中使用EOF即可。

    char ch;
    cin.get(ch);
    while(cin.fail() == false){
    	...
    	cin.get(ch);
    }
    

    可以使用int ch,并用cin.get()代替cin.get(char),用cout.put()代替cout,用EOF测试代替cin.fail() 。

    int ch;
    ch = cin.get();
    while(ch != EOF){
    	...
    	ch = cin.get();
    }
    

    在上述程序中,如果ch是一个字符,则循环将显示它。如果ch为EOF,则循环将结束。

    提示:需要知道的是,EOF不表示输入中的字符,而是指出没有字符。

    呀呀呀 ,不好意思,接下来的额解释我还没弄懂,在书本p158页。我先看看其他的额。

    其中书本p155页的5.5.4我也没看。

    来看一道复习题:

    在查看输入方面,cin>>ch同cin.get(ch)和ch=cin.get()有什么不同?

    答:

    • cin>>ch不能读取空格,换行符,tab字符等。他从遇见的第一个非这些字符开始读取(之前的这些字符将被舍弃),一直读取到遇见这些字符为止,且不读取,且不舍弃。他可以读取各种类型,如int、double、long、char、string等
    • cin.get(ch)的效果是将读取到的字符赋值给ch,它读取空格、换行符、tab字符等。但它对类型有限制,char类型是可以的(貌似且只能读取char类型)。
    • ch=cin.get()也是只读取一个字符,可以读取空格、换行符、tab等,但是它可以读取int类型,读取string类型等多个类型,但它只能读取char内存宽度的字符,假如字符宽度超过char类型,他无法全部读取。
  • 相关阅读:
    。。
    6-4 静态内部类
    SQL把一个表里的数据赋值到另外一个表里去
    jquery 设置 disabled属性
    6-4 内部类
    DWR 整合之Struts2.3.16
    DWR整合之JSF
    DWR整合之Servlet
    dwr.xml 配置
    认识DWR
  • 原文地址:https://www.cnblogs.com/xzxl/p/7368663.html
Copyright © 2011-2022 走看看