头一次起这种标题,为了对得起这个标题,我尽量多写点~

最近还是一边实习一遍投简历——笔试——面试,然而发现了自己的好多问题。

在答了京东笔试(滴滴,360也是这样的)的题后,发现与腾讯,阿里等公司的不同,它利用赛码网的服务,需要你编写可以正确运行的代码(也就是说有点类似机试),可以现在自己的机器上运行后拷贝过去。

我发现最基本的cin与cout都用不明白了。。。这样按照格式读取数据都是个问题~

所以总结一下,这里主要是cin为主如何接收固定格式的字符,数字,字符串等等,我列举了几种情况。

首先,说明一下c++接收字符的几种方式。都包含在#include<iostream>里面。

cin>>str1;   //这种方式默认接收不带空格的,回车表示用户输入结束,一句可以接收一个空格前的字符或字符串

cin.get(ch);   //这种方式可以接收字符

cin.get(str2,10); //这种方式可以接收 字符串(但是不接受string),第二个参数为字符串长度

cin.get();   //这种方式主要是用来舍弃输入流中不需要的字符

cin.getline(strs,16); //这种方式可以接收字符串数组,第二个参数也是字符串长度

cin.getline(strs,16,' '); //这种方式可以接收字符串数组,第三个参数是结束的标志,默认是’\0’。

getline(cin,strs); //这种方式可以接收string类型的字符串

首先以cin>>为主介绍一个重要的用法。代码如下:

char ch;

while(cin>>ch)

{

cout<<ch;

}

比如输入的

1 2  3

a b   c

那运行结果就是123abc,因为cin默认读取空白符(空格,回车,换行,制表,换纸)就会忽略掉。

想避免这种情况就需要设置一个方法。

cin>>noskipws;

下面代码:

char ch;

cin>>noskipws;

while(cin>>ch)

{

cout<<ch;

}

运行结果就是:

1 2  3

a b   c

所以,通过这条语句,我们就可以很容易的读取到各个字符,包括回车等,并且可以用判断语句来实现取舍。下面开始举例几种读取固定格式的方式(包括一些常见题目的解决方案):

1.      读取一个字符串,并且包含空格

①.用string数组: //string的好处多多,最明显的是可以随时修改长度与赋值

#include <string>;

string t=””;

a.下面使用的是最简单方法getline

getline(cin,t);   //读取一个字符串,可以读取(除了回车)空白符

b.下面的是用的cin.get(),下面的方法思想主要是利于字符串的读取实现

cin>>noskipws;     //这个很重要,否则就会永远进行循环

while(cin.get(tch))

{

t+=tch;

if(tch=='\n')

break;         //遇到回车符号就跳过这个字符,并退出循环

}

c.下面的是用cin

cin>>noskipws;

while(cin>>tc)

{

t+=tc;

if(tc=='\n')

break;

}

②用字符串数组: //字符串需要注意的就是字符串一旦完成初始化就不能直接赋值修改,结尾必须是’\0’,所以总的来说,用字符串数组还是相对麻烦的

个字符,一个结束符

int i=0;

a.下面的是用的cin.get();

cin>>noskipws;    
//这个很重要,否则就会永远进行循环

while(cin.get(str2))

{

if(str2=='\n')

break;        
//遇到回车符号就跳过这个字符,并退出循环

if(i<14)

{

str4[i]=str2;

str4[i+1]='\0'; 
//为了保证结尾是’\0’,否则会导致乱码

i++;

}

}

b.用cin,类比上面的即可,不再举例子

c.用cin.getline(strs,16,' \n '); 这样可以直接读取回车前的16个任何字符

2.      读取多个字符串,中间用空格隔开,回车结束.形式如下

Asd 123 333 dcd

stringstr[10];

char
tch;

for(inti=0;i<10;i++)

{

str[i]="";

}

cin>>noskipws;    
//这个很重要,否则就会永远进行循环

i=0;

while (cin.get(tch))

{

if(tch=='\n')

break;        
//遇到回车符号就跳过这个字符,并退出循环

if(tch==' ')

{

i++;continue;

}

str[i]+=tch;

}

3.      读取m*n个字符,每组字符用;隔开。形式如下(4*3)

a b c d;e f g h;I j k l(ab连在一起算两个字符)

chardata[100][100];

intnum1=0;

intnum2=0;

chartemp;

for(inti=0;i<100;i++)

{

for(intj=0;j<100;j++)

data[i][j]='?';

}

cin>>noskipws;

while(cin>>temp)

{

if(temp==';') {num1++;num2=0;continue;}

elseif(temp=='\n')
break;

elseif(temp==' ')
continue;

else

{

data[num1][num2]=temp;

num2++;

}

}

for(inti=0;i<num1+1;i++)

{

for(intj=0;j<num2;j++)

{

cout<<data[i][j]<<' ';

}

cout<<'\n';

}

4.      读取一组数字数字用空格隔开,遇到特殊字符则结束输入

如1 2 3 4 e,那么会记录1234这个int数组

intdata[10];

int
i1=0;

int
j1=0;

while(cin>>x)

{

data[i1]=x;

i1++;

}

for(j1=0;j1<i1;j1++)

cout<<data[j1];

5.      读取m*n个数字,每组数字用;隔开。形式如下(4*3)

1 2 3 4;11 12 13 14;5 6 7 8

提示:如果在cin>>数字的时候使用cin>>noskipws;那么只会读取第一个数字,空格以及其他非数字字符后的一切都会被忽略。

如果这个数组矩阵是大小固定的,那么就可以用for循环n次来解决先读取固定数目的数字,再用cin>>字符读取一个;再用一个for来循环m次读取组数。然而,我们的m与n都是不固定的,而且要用cin>>数字的话,导致无法在循环中判断每一个字符。所以,这里考虑先读取字符,然后转换成数字再处理。

先用string二维数组存起来,

string
data[10][10];

intnum[10][10];

int
num1=0;

int
num2=0;

char
temp;

for(inti=0;i<10;i++)

{

for(intj=0;j<10;j++)

data[i][j]="";

}

cin>>noskipws;

while(cin>>temp)

{

if(temp==';') {num1++;num2=0;continue;}

else
if(temp=='\n')
break;

else
if(temp==' '){num2++;
continue;}

else

{

data[num1][num2]+=temp;

}

}

for(inti=0;i<num1+1;i++)

{

for(intj=0;j<num2+1;j++)

{

//cout<<data[i][j]<<' ';

char  *ch;

ch=newchar(10);

strcpy_s(ch,20,data[i][j].c_str());   
表示替换的缓冲区大小

sscanf_s(ch,"%d",&num[i][j]);   
//这里是把char*转换为int

cout<<num[i][j]<<' ';          
//我们看到这里用的都是_s,是vs为了提高安全性而必须使用的

}                           //其实在一般编译环境下不加_s也是可以的

cout<<'\n';

}

多一个数字转换)

A12 3d 333;42 ds 12l;12 c4 32fc

string
data[10][10];

int
num1=0;

int
num2=0;

char
temp;

for(inti=0;i<10;i++)

{

for(intj=0;j<10;j++)

data[i][j]="";

}

cin>>noskipws;

while(cin>>temp)

{

if(temp==';') {num1++;num2=0;continue;}

else
if(temp=='\n')
break;

else
if(temp==' '){num2++;
continue;}

else

{

data[num1][num2]+=temp;

}

}

for(inti=0;i<num1+1;i++)

{

for(intj=0;j<num2+1;j++)

{

cout<<data[i][j]<<' ';

}

cout<<'\n';

}

最新文章

  1. webgl巧妙方式写着色器代码
  2. XmlRpc.net 出参字符串还原为结构体
  3. OpenCV2+入门系列(三):遍历图像的几种方法
  4. 深入浅出 - Android系统移植与平台开发(十一) - Sensor HAL框架分析之一
  5. XHTML基础
  6. cookie随便写的一点笔记(抄书的)
  7. html验证码
  8. 怎样安装配置tomcat 8
  9. [翻译].NET Shell Extensions - Shell Context Menus---.net 外壳扩展-右键菜单
  10. HATEOAS 约束
  11. linux 与 windows 挖门罗币总结
  12. Win2016以及win10 IIS10 下安装IEwebcontrol的方法
  13. 检验两个随机序列的beta系数
  14. SQLite Manager插件安装与使用(firefox)
  15. (转)Redis集群搭建与简单使用(最少需要 6个节点)
  16. 登陆ArcGIS Server Manager时一直显示”请稍后……”
  17. 修改ECSHOP的小数点保留位数
  18. QtDesigner与程序设计模式
  19. Spearman Rank(斯皮尔曼等级)相关系数
  20. ArcEngine 9.3与64位操作系统 冲突

热门文章

  1. 西门子S7报文解析
  2. 浅谈java枚举类
  3. Linux运维完全小白入门指南
  4. android高仿人人网
  5. 它们的定义Activity跳转动画
  6. Scala &amp; IntelliJ IDEA:环境搭建、helloworld
  7. HTC VIVE 虚拟现实眼镜VR游戏体验
  8. Android Studio右键选项中没有Git?
  9. VC++互相转码GBK,unicode,utf8
  10. delphi2009(10,xe)下indy10发送utf8字符串