C++按格式接收输入字符(京东,滴滴,360笔试必用)

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

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

在答了京东笔试(滴滴,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’,所以总的来说,用字符串数组还是相对麻烦的

 charstr4[15];     //实际上只存放14个字符,一个结束符

 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());    //这里是将string转换为char*20表示替换的缓冲区大小

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

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

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

          cout<<'\n';

 }

6.      读取m*n个字符串。每组用;隔开。形式如下,(其实5就是在6的基础上完成的,5多一个数字转换)

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';

 }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值