(注:本文中的源代码没有包含头文件,实验时请自己编辑。)
请边看边操作,这样才能真正明白其中的窍门:
一,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;
}