zoukankan      html  css  js  c++  java
  • C++ 中字符串标准输入的学习及实验

    声明:下面实验中[]里面表示要输入里面的符号,[]符号本身并未输入

    1、cin>>

    cin使用空白(空格、制表符、回车)来确定字符串的结束位置。

    cin会将换行符留在输入输出队列中。

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     char p[100];
     7     char q[100];
     8     cin>>p;
     9     cout<<p;
    10     cin>>q;
    11     cout<<q;
    12     return 0;
    13 }

    实验:上述程序中输入:good [空格或者tab] job [回车],然后似乎还没等输入第二个字符串q的值,就已经输出了good job
    原因:cin>>把good作为第一个字符串赋值给p,然后job被留在了输入队列中,当执行到cin>>q的时候,发现队列里已经有job了,就直接将job赋值给q,然后执行cout<<q。

    2、面向行的输入cin.get()、cin.getline()

    这两个函数都是cin的成员函数,功能都是读取一行,遇到换行符(回车)认为是字符串的结尾,不同的是getline()将换行符从输入队列中丢弃,而get()会将换行符保留到队列中。

    (1)cin.get()

    原型:

    cin.get(char *str,int ArSzie, char delim)
    cin.get(char *str,int ArSzie)
    cin.get(void)
    cin.get(char)

    读字符串的时候用的是前两个原型,而第三个原型可以读取任何字符(包括换行符)

    参数说明:str读取字符串所放置的位置,ArSize要读取字符串的最大长度,如ArSize为5的时候,则strlen(str)最大只能为4,因为最后一个要放'',delim停止符,如果不设置,则默认为换行符

    功能:读取一行字符串到str中,然后将遇到的停止符留在输入队列中。

    程序1

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     char p[100];
     7     char q[100];
     8     cin.get(p,5);
     9     cout<<p<<endl;
    10     return 0;
    11 }

    输入abcde  输出abcd 。原因:cin.get(p,5)说明p的最大空间长度是5(包括''),所以p里面读取到了abcd''

    程序2

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     char p[100];
     7     char q[100];
     8     cin.get(p,5,'#');
     9     cout<<p<<endl;
    10     return 0;
    11 }

    输入ab#c,输出ab
    程序3

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     char p[100];
     7     char q[100];
     8     cin.get(p,5);
     9     cout<<p<<endl;
    10     cin.get(q,5);
    11     cout<<q<<endl;
    12     return 0;
    13 }

    输入abc回车,输出abc,然后直接两个空白行,结束,没给机会输入q,原因是cin.get(p,5)遇到换行符的时候并没有将换行符从输入队列中丢弃,然后cin.get(q,5)的时候,上来就碰到换行符以为输入结束,所以q值为空
    解决办法,cin.get(p,5),用cin.get()将换行符从输入队列中读走,如程序4

    程序4

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     char p[100];
     7     char q[100];
     8     cin.get(p,5);
     9     cin.get();
    10     cout<<p<<endl;
    11     cin.get(q,5);
    12     cout<<q<<endl;
    13     return 0;
    14 }

    这回p、q都有机会正确的输入输出了

    (2)cin.getline()

    原型:

    cin.getline(char *str,int ArSzie, char delim)
    cin.getline(char *str,int ArSzie)

    参数说明:str读取字符串所放置的位置,ArSize要读取字符串的最大长度,如ArSize为5的时候,则strlen(str)最大只能为4,因为最后一个要放'',delim停止符,如果不设置,则默认为换行符

    功能:读取一行字符串到str中,然后将遇到的停止符从队列里剔除。

    前三个函数和cin.get()的结果一样所以就不再写了,下面直接写一个与cin.get()的程序4想对应的程序,进行对比

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     char p[100];
     7     char q[100];
     8     cin.getline(p,5);
     9     cout<<p<<endl;
    10     cin.getline(q,5);
    11     cout<<q<<endl;
    12     return 0;
    13 }

    该程序中p、q都能正常输入输出,原因对比cin.getline和cin.get的功能即可

    3、getline()   

    使用时要#include<string> 

    原型:

    istream& getline ( istream &is , string &str , char delim );

    istream& getline ( istream& , string& );

    参数:

    is 进行读入操作的输入流

    str 存储读入的内容

    delim 终结

    返回值:
    参数is是一样的

    功能:

    将输入流is中读到的字符存入str中,直到遇到终结符delim才结束。对于第一个函数delim是可以由用户自己定义的终结符;对于第二个函数delim默认为 ' '(换行符)。函数在输入流is中遇到文件结束符(EOF)或者在读入字符的过程中遇到错误都会结束。在遇到终结符delim后,delim会被丢弃,不存入str中。在下次读入操作时,将在delim的下个字符开始读入。

    getline()和cin.getline()区别:

    (1)cin.getline()属于istream流,而getline()属于string流,所以使用getline()的时候要包含头文件string

    (2)原型不一样,特别注意字符串的参数类型cin.getline()中字符串是char *,它可以将字符串读入到char *型的字符串,也可以将字符串读入到string类型的字符串中,getline()原型中的字符串时string类型,所以只能读入到string类型的字符串中,不可以读入到char *类型中

    (3)输入的时候cin.getline限定了输入的最大字节数,而getline没有限制,其实本质原因还是因为原型不一样

  • 相关阅读:
    Java中Volatile关键字详解
    java hashmap&concurrentHashmap源理
    java CAS和AQS
    jvm内存模型
    springAop源码分析
    一个项目设置两个git地址,并最终实现一次性同时推送到到两个git地址上的方法总结
    H5实现横向滚动的方法总结
    tab吸顶的神奇-- css粘性属性
    H5制作显示轮播图的方法Swiper
    微信H5中禁止分享好友及分享到朋友圈的方法
  • 原文地址:https://www.cnblogs.com/bewolf/p/4372965.html
Copyright © 2011-2022 走看看