cin和scanf在使用时的注意事项

(注:本文中的源代码没有包含头文件,实验时请自己编辑。)

请边看边操作,这样才能真正明白其中的窍门:

 

 

一,scanf():

 

常用的有

(1)scanf("%s",a);//a为字符串的指针;

例:

 

int main(){

       chara[20];

       scanf("%s",a);

       printf("%s",a);//输出字符串a中的字符

       return0;

}

 

注意 1,这种获得字符串的方法前面可以有回车符 '\n' ,注意哦!你可以试一下。输入时在前面猛打回车,然后再输入一组字符,这样输出的还是你输出的字符。如下图:

 

       2试完了回车,重新运行一下,然后你在前面加n个空格,然后再输入一个连续的字符,看看会出现什么?你会发现他把前面的空格全忽略了。如果你想要,当然也可以,或者用正则表达式,或者用gets(); 比如: gets(a); 这样,你输入的空格也能记录下来了。如下图:

 

              3,再试一下输入一个连续长度的字符后加一个空格再输入:比如输入一个人的名字的时候“Bill Gates”你会发现输出只有Bill ,而Gates见鬼去了。所以名字的输入和上面一样,最好用gets(); 函数。如下图:

这请弄明白了再往下看。谢谢合作!

 

 

(2)scanf("%c",&a);//注意取地址符;

例:

 

int main(){

       chara;

       scanf("%c",&a);

       printf("%c",a);//输出字符a中的字符

       return0;

}

 

注意:在获得字符时如果有回车,吸收之。你可以这样试一下,运行上面的程序,回车一次,仔细观察他空了几行。(第一行是你敲的,第二行是printf输出的a的值),明白其中的奥妙了么?

 

(3)scanf("%d",&a);

 

int main(){

       inta;

       scanf("%d",&a);

       printf("%d",a);//输出整形a中的值;

       return0;

}

 

注意:这个输入和(1)一样,会自动忽略前面的回车'\n'(其实就是个ascII码) 。

 

 

 

弄明白了以上三个使用方法,看看下面这个程序的输出结果是什么?

例1

输入如下:

 

输出:

 

明白了?没明白再看看前面的然后再往下看;

 

例2,

源程序:

输入:

输出:

看到了么?输入80回车后直接跳过对b的输入跳到printf(“%d\n”,a);去了,输出a后再输出b,现在的b就是一个回车’\n’ 还记得么?  这样,后面跟着两个回车,然后输出了“Press any key to continue”

 

你会发现 %s  %d  是以’\n’当做输入的结束,而不吸收’\n’,所以当给b赋值时由于上次输入留下的’\n’没有被吸收,%c就要上它了。导致你没有输入b的值就直接出结果了。

你可以把上面的首先给int赋初值改成给一个字符串赋初值,后面跟一个给char型字符覆初值。你会发现同样的问题。%c真是来者不拒,呵呵。

这儿非常重要,一定要搞明白了再继续往下看。

 

二, cin

它用起来要比scanf简单多了。

int main(){

       chari;

       charb[20];

       intc;

       cin>>i;        //给字符赋值

       cin>>b;        //给字符串赋值

       cin>>c;        //给整形赋值

}

 

注意:cin和scanf在使用时要特别注意!

cin和scanf就差这了。把上面程序换成一个int型和一个char型,先给int赋值,再给char赋值,也会出现相同的情况,不会像scanf直接跳过去,即使你狂按回车,他照样依然不动声色。

 

 

 

看完了上面这些,再来看一个实例吧。

 

(这是咱们网赛时第二题)

 

TimeLimit : 1Second   Memorylimit : 32 Megabyte  

 

Totalsubmit : 129   Accepted : 31

xiaoA is a beautifulgirl, and she has so many skirts that she won't wear a skirt a second timebefore the skirt is washed. Now xiaoA wants to go shopping, how many skirts shecan choose to wear?

 

In order to distinguishthese skirts, she gives out every skirt with a unique name.

 

Input

The first line of inputcontains a positive integer T (T <= 100), the number of test cases.

 

Each test case containstwo integers N and M (1<=N, M<=100) in the first line.

 

N is the number ofskirts.M is the number of operations.

 

Then N lines follow.Every line contains a word and the word is not longer than 10.

 

Then M lines follow.Each line contains a character 'D' or 'W' and the name of a skirt.

 

'D' indicates thatxiaoA has wore the skirt. 'W' indicates that xiaoA has washed the skirt.

 

Output

After the M operations,you need to output that how many skirts can be chosen by xiaoA to wear.

 

Sample Input

1

 

5 5

 

SkirtA

 

SkirtB

 

SkirtC

 

SkirtD

 

SkirtE

 

D SkirtA

 

D SkirtB

 

D SkirtC

 

D SkirtD

 

W SkirtA

 

Sample Output

2

 

大意:

一个女生有巨多衣服,她有个癖好,不穿穿过的没有洗过的衣服,现在给她有的衣服取个名字,然后告诉你 怎么对衣服操作, D 就是穿过了,W就是洗了。

下面是源代码(有错!!!)注意输入!   W SkirtA 中间有一个空格。

 

 

#include<stdio.h>

#include<memory.h>

#include<string.h>

 

int main(){

       int T;

       int aa[100],i,j,can;

       char ta;

       char tb[11];

       int num,opr;

       char s[100][11];

       scanf("%d",&T);

       while (T--){

              memset(aa,0,sizeof(int)*100);   //这几个的作用是清空这几个指针对应的内存地址

              memset(s,0,sizeof(char)*1100);

              memset(tb,0,sizeof(char)*11);

              can=0;

              scanf("%d%d",&num,&opr);

              for(i=0;i<num;i++){         // 获得衣服的名字,由于题目说 了,是  a word 所

                     scanf("%s",s[i]);        // 以用考虑像 Bill Gates 那样的。

                    

              }

              //下面的作用是输入opration 然后判断是穿还是洗

              for(i=0;i<opr;i++){

                     scanf("%c",ta);   //就在这!!!由于上面是 %s 所以 ‘\n’ 留下了,这时char        

                     scanf("%s",tb);   //把它吸收了,导致出错。要修正的话,只要加个能吸收

                     if(ta=='D'){       //’\n’的东西就行了,比如getchar(); cin.ignore(); 都可以

                            for(j=0;j<num;j++){  // 吸收一个字符。

                                   if(strcmp(s[j],tb)==0)

                                          break;

                                  

                            }

                            (j!=num)?aa[j]=1:0;

                     }

                     else{

                            for(j=0;j<num;j++){

                                   if(strcmp(s[j],tb)==0)

                                          break;

                                  

                            }

                            if(j!=num)

                                   aa[j]=0;

                     }

              }

              for(i=0;i<num;i++){

                    

                     if(aa[i]==0)

                            can++;

              }

              printf("%d\n",can);

             

             

       }

       return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值