简易shell
背景: S.-C.Dong 想要开发一款软件, 内部具有功能 A, B. 他太懒了, 不想在 main 函数上加参
数, 所以他想要单独开发一个shell (类似于命令提示符一样的东西), 通过在这个shell里面输
入这些命令来实现功能. 请你队替他完成开发.
下面是对各个功能的说明:
A 功能:
选项: -i
–input 其后紧接着输入文件的文件名
选项: -o
–output 其后紧跟输出文件的文件名
实现功能, 将 input 的文件中的所有的数字内容提取出来放到 output 的文件中
B 功能:
选项: -i
–input 其后紧接着输入文件的文件名
选项: -o
–output 其后紧跟输出文件的文件名
实现功能: 统计 input 文件中的小写字母个数, 大写字母个数, 数字个数, 空格个数, 其他字
符个数. 如果用户输入了-o 选项并在其后写入了 output 的文件名, 则把这些信息输出到
output 的文件中, 如果用户没有输入-o, 则把以上信息输出到电脑屏幕
注意: 对于 A 功能用户必须输入-i 和 -o 两个选项, 缺少任意一个都要报错
对于 B 功能, 用户必须至少输入-i 选项, 缺少这个要报错, 而对于-o 选项不做限制.
说明: 命令格式如下:
A -i test1.txt -o test2.txt
B -i test1.txt
B -i test1.txt -o test2.txt
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int A(char * filenameIn,char * filenameOut){
FILE *file=fopen(filenameIn,"r"); //读取文档名可以使用绝对路径输入
FILE *fp=fopen(filenameOut,"w"); //结果文件名可以使用绝对路径输入
char str1[99],str2[99];
fgets(str1,100,file);
int i = 0,j=0;
while (*(str1 + i) != '\0'){
if (*(str1 + i) >= '0' && *(str1 + i) <= '9'){
*(str2 + j++) = *(str1 + i);
}
i++;
}
*(str2 + j) = '\0';//字符串的末尾需要加一个串结束符来表示字符串的结束
fputs(str2,fp);
fclose(file);
fclose(fp);
printf("done\n");
return 0;
}
int B(char * filenameIn,char * filenameOut,int key){//key用来判断是否将内容写入文件,key==1就写入,key==0就直接打印到监视器
FILE *file=fopen(filenameIn,"r"); //允许绝对路径输入
char c;
int capitals=0,lowercases=0,space=0,digit=0,others=0;
while((c=fgetc(file))!=EOF){
if(c>='a'&& c<='z')
lowercases++;
else if(c>='A'&&c<='Z')
capitals++;
else if(c==' ')
space++;
else if(c>='0'&&c<='9')
digit++;
else
others++;
}
if(key){
FILE *fp=fopen(filenameOut,"w"); //结果文件可以使用绝对路径输入
fprintf(fp,"all in all:capitals=%d lowercases=%d space=%d digit=%d others=%d\n",capitals,lowercases,space,digit,others);
fclose(file);
fclose(fp);
printf("done\n");
}else{
printf("all in all:capitals=%d lowercases=%d space=%d digit=%d others=%d\n",capitals,lowercases,space,digit,others);
}
return 0;
}
int split(char **arr, char *str, const char *delim){
char *s = strtok(str, delim);
int c=0;
while (s!=NULL) {
*arr++ = s;
s = strtok(NULL, delim);
c++;
}
return c;
}
int main(){
char *getin ;
char * str[10]; //string 类型的指针能存入10个字符串
for(int i;i<10;i++){
str[i]=(char *)calloc(10,sizeof(char));//每个子串给10个字符的空间,相比malloc能够初始化,便于通过其内的字符来判断是否为空
}
printf("help:\nuse \"quite\" command to quite\nAbsolute path is recommended unless the file is in the root directory\nyou can use any absolute path to process the file, as long as the file exist\n");
printf(">");gets(getin);
do{
if(!strcmp(getin, "quite"))break;
else{
split(str,getin," ");
}
//功能A
if(!strcmp(str[0], "A")){
//命令语句合法性判断及报错
if(!strcmp(str[1],"-i")&&!strcmp(str[3],"-o")&&str[2][0]!='\0'&&str[4][0]!='\0'){
A(str[2],str[4]);
}else
printf("命令错误");
}
//功能B
else if(!strcmp(str[0], "B")){
//命令语句合法性判断及报错
if(!strcmp(str[1],"-i")){
B(str[2],str[4],str[3][0]!='\0'&&str[4][0]!='\0');
}else
printf("命令错误");
}
printf(">");gets(getin);
}while(strcmp(getin, "quite"));
return 0;
}
README.txt
(一)功能说明:
A 功能:
选项: -i –input 其后紧接着输入文件的文件名
选项: -o –output 其后紧跟输出文件的文件名
实现功能, 将 input 的文件中的所有的数字内容提取出来放到 output 的文件中
B 功能: 选项: -i –input 其后紧接着输入文件的文件名
选项: -o –output 其后紧跟输出文件的文件名
实现功能: 统计 input 文件中的小写字母个数, 大写字母个数, 数字个数, 空格个数, 其他字 符个数.
如果用户输入了-o 选项并在其后写入了 output 的文件名, 则把这些信息输出到 output 的文件中, 如果用户没有输入-o, 则把以上信息输出到电脑屏幕(且不会写入到文件中)
(二)使用说明:
1.程序没有对文件的存在做过多的判断,所以不能输入一个不存在的文件。
2.如果只使用相对路径,应该保证shell.exe和输入输出文件都在同一个目录下。
3.命令中的所有文件名都能更换为绝对路径,这种情况下,即使shell.exe和输入输出文件不在同一目录下也能完成处理。
4.“>···”行内输入命令,如:A -i [输入文件名] -o [输出文件名]
对A -i和-o参数同时存在
对B -o参数可选