cin和scanf在使用时的注意事项.docx
《cin和scanf在使用时的注意事项.docx》由会员分享,可在线阅读,更多相关《cin和scanf在使用时的注意事项.docx(12页珍藏版)》请在冰豆网上搜索。
cin和scanf在使用时的注意事项
cin和scanf在使用时的注意事项
(注:
本文中的源代码没有包含头文件,实验时请自己编辑。
)
请边看边操作,这样才能真正明白其中的窍门:
一,scanf():
常用的有
(1)scanf("%s",a);//a为字符串的指针;
例:
intmain(){
chara[20];
scanf("%s",a);
printf("%s",a);//输出字符串a中的字符
return0;
}
注意:
1,这种获得字符串的方法前面可以有回车符'\n',注意哦!
你可以试一下。
输入时在前面猛打回车,然后再输入一组字符,这样输出的还是你输出的字符。
如下图:
2试完了回车,重新运行一下,然后你在前面加n个空格,然后再输入一个连续的字符,看看会出现什么?
你会发现他把前面的空格全忽略了。
如果你想要,当然也可以,或者用正则表达式,或者用gets();比如:
gets(a);这样,你输入的空格也能记录下来了。
如下图:
3,再试一下输入一个连续长度的字符后加一个空格再输入:
比如输入一个人的名字的时候“BillGates”你会发现输出只有Bill,而Gates见鬼去了。
所以名字的输入和上面一样,最好用gets();函数。
如下图:
这请弄明白了再往下看。
谢谢合作!
(2)scanf("%c",&a);//注意取地址符;
例:
intmain(){
chara;
scanf("%c",&a);
printf("%c",a);//输出字符a中的字符
return0;
}
注意:
在获得字符时如果有回车,吸收之。
你可以这样试一下,运行上面的程序,回车一次,仔细观察他空了几行。
(第一行是你敲的,第二行是printf输出的a的值),明白其中的奥妙了么?
(3)scanf("%d",&a);
例
intmain(){
inta;
scanf("%d",&a);
printf("%d",a);//输出整形a中的值;
return0;
}
注意:
这个输入和
(1)一样,会自动忽略前面的回车'\n'(其实就是个ascII码)。
弄明白了以上三个使用方法,看看下面这个程序的输出结果是什么?
例1
输入如下:
输出:
明白了?
没明白再看看前面的然后再往下看;
例2,
源程序:
输入:
输出:
看到了么?
输入80回车后直接跳过对b的输入跳到printf(“%d\n”,a);去了,输出a后再输出b,现在的b就是一个回车’\n’还记得么?
这样,后面跟着两个回车,然后输出了“Pressanykeytocontinue”
你会发现%s和%d是以’\n’当做输入的结束,而不吸收’\n’,所以当给b赋值时由于上次输入留下的’\n’没有被吸收,%c就要上它了。
导致你没有输入b的值就直接出结果了。
你可以把上面的首先给int赋初值改成给一个字符串赋初值,后面跟一个给char型字符覆初值。
你会发现同样的问题。
%c真是来者不拒,呵呵。
这儿非常重要,一定要搞明白了再继续往下看。
二,cin
它用起来要比scanf简单多了。
intmain(){
chari;
charb[20];
intc;
cin>>i;//给字符赋值
cin>>b;//给字符串赋值
cin>>c;//给整形赋值
}
注意:
cin和scanf在使用时要特别注意!
请跟我走;
例1
输入
输出:
这一点和scanf是一样地;
例2
还是上面那个程序,输入
输出
这一点和scanf也一样
例3
还是上面的那个程序,输入
输出:
跟scanf一样…………那到底哪不一样呢…………
接着往下看;
源程序:
输入:
你先猜猜结果是啥?
如果是scanf,那肯定是输入完abcdef后回车,就输出结果了。
输出结果:
失望了吧,它在等你输入b的值那!
当随便输入一个后,结果如下:
怎样?
看出点猫腻了吧?
cin和scanf就差这了。
把上面程序换成一个int型和一个char型,先给int赋值,再给char赋值,也会出现相同的情况,不会像scanf直接跳过去,即使你狂按回车,他照样依然不动声色。
看完了上面这些,再来看一个实例吧。
(这是咱们网赛时第二题)
TimeLimit:
1SecondMemorylimit:
32Megabyte
Totalsubmit:
129Accepted:
31
xiaoAisabeautifulgirl,andshehassomanyskirtsthatshewon'twearaskirtasecondtimebeforetheskirtiswashed.NowxiaoAwantstogoshopping,howmanyskirtsshecanchoosetowear?
Inordertodistinguishtheseskirts,shegivesouteveryskirtwithauniquename.
Input
ThefirstlineofinputcontainsapositiveintegerT(T<=100),thenumberoftestcases.
EachtestcasecontainstwointegersNandM(1<=N,M<=100)inthefirstline.
Nisthenumberofskirts.Misthenumberofoperations.
ThenNlinesfollow.Everylinecontainsawordandthewordisnotlongerthan10.
ThenMlinesfollow.Eachlinecontainsacharacter'D'or'W'andthenameofaskirt.
'D'indicatesthatxiaoAhasworetheskirt.'W'indicatesthatxiaoAhaswashedtheskirt.
Output
AftertheMoperations,youneedtooutputthathowmanyskirtscanbechosenbyxiaoAtowear.
SampleInput
1
55
SkirtA
SkirtB
SkirtC
SkirtD
SkirtE
DSkirtA
DSkirtB
DSkirtC
DSkirtD
WSkirtA
SampleOutput
2
大意:
一个女生有巨多衣服,她有个癖好,不穿穿过的没有洗过的衣服,现在给她有的衣服取个名字,然后告诉你怎么对衣服操作,D就是穿过了,W就是洗了。
下面是源代码(有错!
!
!
)注意输入!
WSkirtA中间有一个空格。
#include
#include
#include
intmain(){
intT;
intaa[100],i,j,can;
charta;
chartb[11];
intnum,opr;
chars[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;iscanf("%s",s[i]);//以用考虑像BillGates那样的。
}
//下面的作用是输入opration然后判断是穿还是洗
for(i=0;iscanf("%c",ta);//就在这!
!
!
由于上面是%s所以‘\n’留下了,这时char
scanf("%s",tb);//把它吸收了,导致出错。
要修正的话,只要加个能吸收
if(ta=='D'){//’\n’的东西就行了,比如getchar();或cin.ignore();都可以
for(j=0;jif(strcmp(s[j],tb)==0)
break;
}
(j!
=num)?
aa[j]=1:
0;
}
else{
for(j=0;jif(strcmp(s[j],tb)==0)
break;
}
if(j!
=num)
aa[j]=0;
}
}
for(i=0;iif(aa[i]==0)
can++;
}
printf("%d\n",can);
}
return0;
}