📄 wc.c
字号:
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>
void showhelp(void);
void showversion(void);
void showerr_s(char * s);
void showerr_c(char c);
int main(int argc, char * argv[])
{
FILE *fp;
int nOver = 1;
int cflag = 0, mflag = 0, lflag = 0, Lflag = 0, wflag = 0;
int i = 0, j = 0, k = 0;
char curChar,preChar;
long noLines = 0,noWords = 0,noCharacters = 0,noBytes = 0,nomaxlen = 0;
long tnoLines = 0,tnoWords = 0,tnoCharacters = 0,tnoBytes = 0,tnomaxlen = 0;
long lentemp = 0;
char * filename[30];
for(i = 1; i<argc; i++)
{
if(argv[i][0] == '-')
{
if(argv[i][1] == '-')
{
if(strcmp(argv[i],"--help")==0)
{
showhelp();
exit(0);
}
else if(strcmp(argv[i],"--version")==0)
{
showversion();
exit(0);
}
else
{
showerr_s(argv[i]);
exit(1);
}
}
else
{
for(j = 1; j<strlen(argv[i]); j++)
{
switch(argv[i][j])
{
case 'c':
cflag = 1;
break;
case 'm':
mflag = 1;
break;
case 'l':
lflag = 1;
break;
case 'L':
Lflag = 1;
break;
case 'w':
wflag = 1;
break;
default:
{
showerr_c(argv[i][j]);
exit(1);
}
}
}
}
}
else
{
filename[k] = argv[i];
k++;
}
}
if(k == 0)
{
preChar = 0;
curChar = getchar();
noLines = 0;
while(nOver)
{
switch(curChar)
{
case '\t':
case ' ':
if(preChar!=' '&&preChar!='\t'&&preChar!='\n'&&preChar!=0)
noWords++;
noBytes++;
lentemp++;
break;
case '\n':
if(preChar!=' '&&preChar!='\t'&&preChar!='\n'&&preChar!=0)
noWords++;
noLines++;
noBytes++;
if(lentemp>nomaxlen)
nomaxlen = lentemp;
lentemp = 0;
break;
case 4:
case 0:
case 27:
nOver = 0;
if(preChar!=' '&&preChar!='\t'&&preChar!='\n'&&preChar!=0)
noWords++;
break;
default:
noBytes++;
lentemp++;
if(isalpha(curChar))
noCharacters++;
}
preChar = curChar;
curChar = getchar();
}
if(cflag == 0 && lflag == 0 && wflag == 0 && mflag == 0 && Lflag == 0)
printf("\t%d\t%d\t%d\n",noLines+1,noWords,noBytes);
else
{
if(lflag == 1)
printf("\t%d",noLines);
if(wflag == 1)
printf("\t%d",noWords);
if(cflag == 1)
printf("\t%d",noBytes);
if(mflag == 1)
printf("\t%d",noCharacters);
if(Lflag == 1)
printf("\t%d",nomaxlen);
printf("\n");
}
}
else
{
for(j = 0; j<k; j++)
{
noLines = 0;
noWords = 0;
noCharacters = 0;
noBytes = 0;
if( (fp = fopen(filename[j],"r"))==NULL )
{
printf("mywc: %s: not exists or other errors occur\n",filename[j]);
continue;
}
preChar = 0;
while((curChar = fgetc(fp))!=EOF)
{
switch(curChar)
{
case '\t':
case ' ':
if(preChar!=' '&&preChar!='\t'&&preChar!='\n'&&preChar!=0)
noWords++;
noBytes++;
lentemp++;
break;
case '\n':
if(preChar!=' '&&preChar!='\t'&&preChar!='\n'&&preChar!=0)
noWords++;
noLines++;
noBytes++;
if(lentemp>nomaxlen)
{
nomaxlen = lentemp;
if(nomaxlen>tnomaxlen)
tnomaxlen = nomaxlen;
}
lentemp = 0;
break;
default:
noBytes++;
lentemp++;
if(isalpha(curChar))
noCharacters++;
break;
}
preChar = curChar;
}
if(preChar!=' '&&preChar!='\t'&&preChar!='\n'&&preChar!=0)
{
noWords++;
if(lentemp>nomaxlen)
{
nomaxlen = lentemp;
if(nomaxlen>tnomaxlen)
tnomaxlen = nomaxlen;
}
}
fclose(fp);
if(cflag == 0 && lflag == 0 && wflag == 0 && mflag == 0 && Lflag == 0)
printf("\t%d\t%d\t%d\t%s\n",noLines,noWords,noBytes,filename[j]);
else
{
if(lflag == 1)
printf("\t%d",noLines);
if(wflag == 1)
printf("\t%d",noWords);
if(cflag == 1)
printf("\t%d",noBytes);
if(mflag == 1)
printf("\t%d",noCharacters);
if(Lflag == 1)
printf("\t%d",nomaxlen);
printf("\t%s\n",filename[j]);
}
tnoLines += noLines;
tnoWords += noWords;
tnoCharacters += noCharacters;
tnoBytes += noBytes;
nomaxlen = 0;
}
}
if(k>1)
{
if(cflag == 0 && lflag == 0 && wflag == 0 && mflag == 0 && Lflag == 0)
printf("\t%d\t%d\t%d\tgeneral\n",tnoLines,tnoWords,tnoBytes);
else
{
if(lflag == 1)
printf("\t%d",tnoLines);
if(wflag == 1)
printf("\t%d",tnoWords);
if(cflag == 1)
printf("\t%d",tnoBytes);
if(mflag == 1)
printf("\t%d",tnoCharacters);
if(Lflag == 1)
printf("\t%d",tnomaxlen);
printf("\tgeneral\n");
}
}
return 0;
}
void showhelp(void)
{
printf("usage: mywc [option]...[FILE]...\n");
printf("Print byte,word,and newline counts for each FILE,and a total line if more than one FILE is specified. With on File,read standard input, press key [Esc] to end inputting\n");
printf("\t-c, --bytes\tPrint the byte counts.\n");
printf("\t-m, --chars\tPrint the character counts.\n");
printf("\t-l, --lines\tPrint the newline counts.\n");
printf("\t-L, --max-line-length\tPrint the length of the longest line.\n");
printf("\t-w, --words\tPrint the word counts.\n");
printf("\t --help\tPrint this usage message and then exit\n");
printf("\t --version\tPrint version information and then exit.\n");
printf("\nReport bugs to <gary@mail.hdss.org>.\n");
}
void showversion(void)
{
printf("mywc by imitating wc in Redhat 9.0\n");
printf("Written by Gary(02101231).\n");
printf("This version is free.\n");
}
void showerr_s(char * s)
{
printf("mywc: can't identify option \"%s\"\n",s);
printf("try \"mywc --help\" to get more infomations\n");
}
void showerr_c(char c)
{
printf("mywc: wrong option -\"%c\"\n",c);
printf("try \"mywc --help\" to get more infomations\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -