C++的输入输出实践

最近很多笔试涉及字符串的输入输出,如果输入输出都搞不定,即使写出了算法也没法AC。为了使自己在这方面更加熟练,进行了实践。

C++中iostream里面最常用的就是cin和cout了,即输入输出流。

cin>>tmp;的意思是将控制台输入的值存入变量tmp中,但是对于不同场合意义不一样。

如果tmp是个整型,那么直接存入即可,但如果是字符串,就不一样了。其实cin>>tmp是两个操作:1,将用户输入的值存入输入缓冲区,2,将输入缓冲区中的值解析到变量tmp。

对于字符串中存在空格的情形,cin解析的时候遇到空格就不解析了。例如输入"hello world",cin到tmp的结果为hello

如果采用 cin>>a>>b;则a为"hello",b为"world"

要是只输入一个,那么应采用getline()。

getline的本质就是从输入缓冲区读取数据,如果数据没有读完,那么下一次getline会继续读取剩余的数据。

getline有两个,一个是istream下的getline,一个是std下的getline。

istream下的getline的函数原型是:

istream& getline (char* s, streamsize n );   // 
istream& getline (char* s, streamsize n, char delim ); //

std下的getline的函数原型是:

istream& getline (istream& is, string& str, char delim); //将输入缓冲区的值存入str中,直到遇到第一个delim为止。
istream& getline (istream& is, string& str); //将输入缓冲区的值全部存入str中。默认的delim为'\n'

可以看到返回值是istream的引用。并且四个函数是重载的。

实测:

    string ss;
    getline(cin, ss, ' '); //该函数是个阻塞的函数,如果输入缓冲区中有数据则直接返回;如果输入缓冲区没有数据则阻塞,等待用户输入。  

    //此处用户输入了 what a good day!,注意第三个参数的作用。此时输入缓冲区的内容为"what a good day!",但是由于遇到空格就结束解析,因此存入ss中的数据为what,并且输入缓冲区中的内容为"a good day.".
    cout << ss << endl; // 输出"what"

    char s[256];
    cin.getline(s, 256, '.');//该函数是istream下的getline,跟std下的功能是一样的,他也是个阻塞函数,由于输入缓冲区存再数据,直接读取数据,遇到'.'才结束,这里要注意,如果找不到字符'.'则会导致问题。因此要格外小心。最保险的是\n,因为\n通常为输入结束标志。
    cout << s << endl;//"a good day"

cin>>a;和getline(cin, a, ' ');的区别:

看似都是遇到空格停止,实则不然,cin会忽略前置空格,getline(cin, a, ' ')不会。

cin>>a;将输入的内容放入缓冲区,然后根据输入的字符串,开始读数据。读取方式:从第一个非空格字符开始到第二个空格为止。例如用户输入"       hello world    hi"。则cin>>a;得到的a为hello。

此时如果继续cin>>b则按照相同方式进行读取,读到world。此时缓冲区的内容为"    hi"。如果用getline(cin, a, ' ')读取将读到空,

如果用getline(cin, a)读取将读到"    hi"。

格式输入,例如输入数据为10,20;30,40这种,C++用scanf和sscanf来处理格式化输入。

    string ss;
    ss = "10,20;30,40";

    int a, b, c, d;
    //scanf("%d,%d;%d,%d", &a, &b, &c, &d);//控制台输入方式
    
    sscanf(ss.c_str(), "%d,%d;%d,%d", &a, &b, &c, &d); //已有字符串处理方式
    cout << a <<" "<< b << " " << c << " " << d <<endl;

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值