以前的字符串题本来就弱。。2年不写就更弱了。嗯。留作教训
God Le is the most talented ACMer in the TJU-ACM team.
When he wants to open a file,he can just use his keyboard instead of using his mouse to click.
Why he can do this?Because he uses the cmd.exe. There are many commands in cmd.exe.But God Le is kind of lazy,so he just uses three commands to change the current directory.
"cd dir"(without quotes):put you in a subdirectory.For example,if you are in C:\Programs,typing cd Vim will put you in C:\Programs\Vim.
"Disk(like C,D,etc):"(without quotes):put you in the directory in that Disk that you are in most recently.For example,if you are in C:\Programs,typing D: and C: will put you in C:\Programs.(at the beginning,when you type Disk:,you will be in Disk:\).
"cd .."(without quotes):move you up one directory.So,if you are in C:\Programs\Vim,cd .. moves you to C:\Programs.
Because God Le is very smart,he won't go to the directory that is not existed. Now,given a sequence of commands,God Le wants to know the current directory.
One thing that you should know is that God Le's computer only have four disks C,D,E,F.
HINT I:The initial directory is C:\users\godle
HINT II:every subdirectory is only a string contains no more than 10 lower-case letters.
There are mulit cases.Each case begins with an integer m(1 ≤ m ≤ 10^3)means the operations.Next there are m lines.Each line contains a command.
For each command,print the current directory.You can get more hints from the sample.
5 cd .. D: cd .. cd abc C:
C:\users D: D: D:\abc C:\users
题目大意:就是读命令 执行 输出结果 很简单的模拟题
但要注意一下几点
1.Disk命令: 如果当前在 C:\zhou 进行1.D: 2. C: 命令后回到C:\zhou 而不是去C:\。
2.mulit case : 英语不好就这样被坑了。。结合样例以为只有一组数据 结果WA了N遍还不知悔改
3.反斜杠赋值要这样做 c='\\'
4.读了m后 还有一个换行符没读。如果用gets()读的话,记得用一次gets()把那个换行符给过滤掉
5.当然这题用 scanf("%s") 去处理似乎更加完美 详情见下面代码
6 活用 strcat strcmp strcat
上一下大牛代码仔细分析分析
<pre name="code" class="html"><pre name="code" class="cpp"><pre name="code" class="html"><pre name="code" class="cpp">#include<stdio.h> #include<string.h> int main() { freopen("a.txt","r",stdin); freopen("c.txt","w",stdout); char str[4][20000]; char temp[20],dir[20]; int i,m,cur,j,len; while(scanf("%d",&m)!=EOF) { cur=0; strcpy(str[0],"C:\\users\\godle"); strcpy(str[1],"D:"); strcpy(str[2],"E:"); strcpy(str[3],"F:"); for(i=0;i<m;i++) { scanf("%s",temp); if(strcmp(temp,"cd")==0) { scanf("%s",dir); if(strcmp(dir,"..")==0) { len=strlen(str[cur]); for(j=len-1;j>=0;j--) if(str[cur][j]=='\\') break; if(j>=0) str[cur][j]=0; } else { strcat(str[cur],"\\"); strcat(str[cur],dir); } } if(strcmp(temp,"C:")==0) { cur=0; } if(strcmp(temp,"D:")==0) { cur=1; } if(strcmp(temp,"E:")==0) { cur=2; } if(strcmp(temp,"F:")==0) { cur=3; } printf("%s\n",str[cur]); } } return 0; }
十分优美的代码
因为多年没写 所以先解析基础知识
1.首先strcpy
/********************** *C语言标准库函数strcpy的一种典型的工业级的最简实现 *返回值:目标串的地址。 *对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL。 *参数:des为目标字符串,source为原字符串 */ char*strcpy(char*des,constchar*source) { char*r=des; while(*des++=*source++); return; } /*while((*des++=*source++));的解释:赋值表达式返回左操作数,所以在复制NULL后,循环停止*/
最正宗的源码 /*strcmpfunction*/ #include<string.h>I int(strap)(constchar*sl,constchar*s2) {/*compareunsignedcharsl[],s2[]*/ for(;*sl==*s2;++sl,++s2) if(*sl=='\O') return(0); return((*(unsignedchar*)sl<*(unsignedchar*)s2)?-1:+1); }
3.strcpy
用法
#include <string.h>
在C++中,则存在于<cstring>头文件中
功能
把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。
说明
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
char*strcat(char*strDest,constchar*strSrc) { char*address=strDest; while(*strDest) strDest++; while(*strDest++=*strSrc++) {} return address; }仔细分析分析这道字符串题代码
很容易发现这类题目函数scanf ()的奇妙运用比Gets()好很多利用string的函数更是完美。
字符串的题目就是要多模仿代码。
上我丑陋的代码了
#include<stdio.h> char A[101]; char s[5][1010]; int temp[5],d=0; int main() { freopen("a.txt","r",stdin); freopen("b.txt","w",stdout); int n=0,i=0,j=0,t=0,x=0,z=0; while(scanf("%d",&n)>0) { i=0,j=0,t=0,x=0,z=0,d=0; memset(temp,0,sizeof(temp)); memset(s,0,sizeof(s)); temp[0]=2; strcpy(s[0],"C:\\users\\godle"); strcpy(s[1],"D:"); strcpy(s[2],"E:"); strcpy(s[3],"F:"); gets(A); for(i=1;i<=n;i++) { memset(A,0,sizeof(A)); gets(A); if(A[0]=='c'&&A[1]=='d') if(A[3]=='.') { t=0;x=0; if (temp[d]==0) {printf("%c%c",s[d][0],s[d][1]); printf("\n");} else { temp[d]=temp[d]-1; for(t=0;t<=temp[d];x++) { if(s[d][x]=='\\') t++; if(t<=temp[d]) printf("%c",s[d][x]); } s[d][x-1]=0; printf("\n"); } } else { temp[d]=temp[d]+1; for(x=0;s[d][x]!=0;x++) printf("%c",s[d][x]); s[d][x]='\\';x++;z=x-1; for(t=3;A[t]!=0;t++,x++) s[d][x]=A[t]; s[d][x]=0; for(x=z;s[d][x]!=0;x++) printf("%c",s[d][x]); printf("\n"); } else { if(A[0]=='C') d=0; else if(A[0]=='D') d=1; else if(A[0]=='E') d=2; else if(A[0]=='F') d=3; for(x=0;s[d][x]!=0;x++) printf("%c",s[d][x]); printf("\n"); } } } return 0; }