C++ cin的一些小特点问题

问题1:cin如何确定已完成字符串的输入?

由于不能通过键盘输入空字符,因此cin使用空白(空格,制表符和换行符)来确定字符串的结束位置;

这意味着cin在获取字符数组输入时只读取一个单词,读取该单词后,cin将字符串放在数组中,并自动在结尾添加空字符串;

例:

#include <iostream>

int main()
{
using namespace std;
const int Size=20;
char name[Size];
char things[Size];

cout<<"Enter your name:\n";
cin>>name;
cout<<"Enter the name of your favorite things:\n";
cin>>things;
cout<<things<<endl<<name<<endl;
return 0;
}

输出:

无空格时输出正常:

有空格时输出异常:

刚打完name后回车就直接出结果了,如下图:

问题2:

我设置的数组长度为

const int Size=20;

如果cin时输入的字符长度长于20,则也会有异常:

解决方案:

面向行的输入

getline()与get(),这两个函数都是读取一行输入,直到到达换行符;

但随后getline()将丢弃换行符,而get()将换行符保留在输入序列中;

1)getline()通过回车输入的换行符确定输入结尾,

  调用方法:cin.getline(xxx,xxx);等

       getline(cin,xxx,xxx);等

  具体MSDN;

本例中,cin.getline(name,20);//最多读取19个字符,最后余下空间用于自动存储结尾处的空字符;

getline()成员函数在读取指定的字符数目或遇到换行符停止读取,并用空字符替换换行符;

2)get()函数

该函数有几个变体,其中一个变体的工作方式与getline()类似,接受参数相同,解释参数也相同,并且都读到结尾;

但不再读取并丢弃换行符了,而将其留在输入队列中;

所以连续两次的读取将会出现问题;

解决方法:后面使用不带参数的get()可读取下一个字符(即使是换行符)

     第10行代码后插入一行加上cin.get();

     或合并写法  第10行改为  cin.get(name,Size).get();均可。

当getline()或get()读取空行后,get()(不是getline())将设置失效位置(failbit);接下来的输入被阻断,恢复用:cin.clear();

但输入字符串比分配空间长,则getline()与get()会将余下的字符留在输入队列中;

getline()遇到换行符后,会认为是一个空行,并将一个空字符串赋值给目标;解决的办法是先读取换行符并丢弃,包括get()函数;

例:cin>>year;

cin.get();//或等同于  (cin>>year).get();

C++ cin的一些小特点问题

时间: 2024-10-29 02:45:35

C++ cin的一些小特点问题的相关文章

下沙小面的(2)

Description 前文再续,书接上一题.话说当上小面的司机的Lele在施行他的那一套拉客法则以后,由于走的路线太长,油费又贵,不久便亏本了.(真可怜-)于是他又想了一个拉客的办法. 对于每一次拉客活动,他一次性把乘客都拉上车(当然也不会超过7个,因为位置只有7个).然后,Lele计算出一条路线(出于某些目的,Lele只把车上乘客的目的地作为这条路线上的站点),把所有乘客都送到目的地(在这路线上不拉上其他乘客),并且使总路线长度最短. 不过Lele每次都要花很多时间来想路线,你能写个程序帮他

ACM 刷题小技巧【转】

转载自URl-team ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 大数据输入输出时最好不要用cin.cout,防止超时. 2.有时候int型不够用,可以用long long或__int64型(两个下划线__). 值类型表示值介于 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )之间的整数.

NOI 1.5 44:第n小的质数

---恢复内容开始--- 描述 输入一个正整数n,求第n小的质数. 输入 一个不超过10000的正整数n. 输出 第n小的质数. 样例输入 10 样例输出 29 方法1:合数一定可以表示成一个比它小的质数的几倍,所以若一个数不能整除比它小的所有的质数,则这个数是质数.所以,若要找第n个质数,则可以第n-1个质数为起点开始,通过上述方法判断. 1 #include<iostream> 2 using namespace std; 3 int n,s; 4 int p[10001]; 5 int

tyvj1294 小v的舞会

背景 "梦中伊人,断我男儿几寸柔肠,于断桥,不知西风自憔悴那姑娘."小v的梦中伊人要带领一大帮姐妹MM们来小v家举办舞会,然而怎么安排跳舞的顺序成了大问题,你能帮他么? 描述 有n个MM要站成若干个圈来跳华尔兹,而每个MM都有一个漂亮值Si,跳舞时第i个MM所表现出来的漂亮值为:该MM的漂亮值与其后面MM的漂亮值之差的绝对值(规定顺时针方向为向后),如果某个MM单独站成一个圈(假设能站成),则其漂亮值为0,你的任务是找出这个最大能表现出的漂亮值. 输入格式 第一行一个整数n,表示n个M

ACM入门小总结

1.scanf和printf所用的时间大大少于cin和cout消耗的时间. 2.Gets()函数用于读取一整行的函数,可以无限读取,不会判断上限,遇到回车结束,慎用. Getchar()函数可以一次读取一个字符,这个字符可以是回车.Putchar()与之对应,输出一 个字符. 3.EOF是一个预定义的常量,等于-1. 4.Strcmp()和compare()都是用来比较两个字符串的,相同时返回0,前者比后者大返回1(strcmp返回正数),前者比后者小返回-1(strcmp返回负数). 5.C+

D的小L

描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡出了个题目想难倒匡匡(小L很D吧),有一个数n(0<n<10),写出1到n的全排列,这时匡匡有点囧了,,,聪明的你能帮匡匡解围吗? 输入 第一行输入一个数N(0<N<10),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个整数x(0<x<10) 输出 按特定顺序输出所有组合. 特定顺序:每一个组合中的值从小到大排列,组合之间按字典序排

NYOJ 55 懒省事的小明 (优先队列)

题目意思: http://acm.nyist.net/JudgeOnline/problem.php?pid=55 每一次合并,小明可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.小明在合并果子时总共消耗的体力等于每次合并所耗体力之和. 因为还要花大力气把这些果子搬回家,所以小明在合并果子时要尽可能地节省体力.假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使小明耗费的体力最少,并

BZOJ 3065 带插入区间K小值 替罪羊树套线段树

题目大意:带插入,单点修改的区间k小值在线查询. 思路:本年度做过最酸爽的题. 树套树的本质是一个外层不会动的树来套一个内层会动(或不会动)的树.两个树的时间复杂度相乘也就是差不多O(nlog^2n)左右.但是众所周知,高级数据结构经常会伴有庞大的常数,所以一般来说树套树的常数也不会小到哪去.所以在做这种题的时候先不要考虑常数的问题... 为什么要用替罪羊树呢?因为一般的平衡树都是会动的,这就很难办了.外层的树动了之后,内层的树肯定也是会动的.很显然,一般的二叉平衡树会经常会旋转,这样在动外层的

NYOJ 49 开心的小明(经典01背包水题)

开心的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行".今天一早小明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N 元.于是,他把每件物品规定了一个重要度,分为5 等:用整数1~5 表示,第5 等最重要.他还从因特网上查到了每件物品的价格(都是整数元).