実装させる機能は
1.指定されたファイル内容を順番につなげて標準出力に出力する。
ファイル名が1つも指定されない場合は、標準入力から入力する。
2.オプションは -n, -h, -t の3種類とし、オプションの指定の順序に関係なく自由に組み合わせることが可能とする。
-nオプション: 各行の先頭に行番号を表示。
-hオプション: 出力開始行の指定。たとえば -h3 で3行目から出力する。
-tオプション: 出力終了行の指定。たとえば -t5 で5行目まで表示する。
※文字列の比較には以下に示すstrncmp関数を使うこと。
int strncmp(const char *s1, const char *s2, size_t n)
2つの文字列s1とs2で、最初のn文字だけを較べる。この関数は、s1がs2に較べて1)小さい、2)同じ、3)大きい場合に、
0よりも1)小さい、2)同じ、3)大きい整数を返す。
また、文字列から整数値を得るために、以下の関数を利用してもよい。
int atoi(const char *nptr)
atoi関数は,notrによって支持される文字列の初めの部分をint型整数に変換する。
3.エラー処理をすること。少なくとも、オプションが正しくない場合に、オプションの指定を知らせるようにする。
というものです。
そして以下に書いたのが自分で書いたプログラムです。
#include <stdio.h>
#define BUFSIZE 1000
main(int argc, char *argv[])
{
char buf[BUFSIZE];
char *prog = argv[0];
int line=1;
FILE *fp = stdin;
int i;
for(i=1; i<=argc; i++){
if(argc > 1 ){
if((fp = fopen(argv[i],"r")) == NULL){
fprintf(stderr, "%s: %s: Nosuch file or directory\n", prog, argv[i]);
exit(1);
}
}
if(*fp == '-'){
switch(*fp++){
case 'n':
while( fgets (buf, BUFSIZE, fp)!=NULL){
printf("%d",line);
fputs(buf,stdout);
line++;
}
case 'h':
*nptr==fp++;
atoi(const char *nptr)
while( fgets (buf, BUFSIZE, fp)!=NULL){
fputs(buf,stdout);
}
}
}
if( fp != stdin){
fclose( fp );
}
}
}
機能2を実装させようと書いているうちの自分が何を書いているのかわけがわからなくなってしまいました。
自分ではまず*fpの指している文字が - のとき*fpが指している次の文字*fp++ をswich文で分類しようと思ったのですが、
これだとfor文で2週目にきたときに肝心のファイルを読み込んだときにfp*が - を指していなければ何も実行されずに終わってしまいます。
どうしたらよいのかまったく思いつかないので、
どうすれば -n -h -t を判別できるか、どうすれば 出力の開始(終了)位置を決められるか、などの考え方を教えていただけないでしょうか?
課題の提出期限が来週の火曜なのでこのGW中に終わらせないとまずいのであせっております。
何卒よろしくお願いします。
OS:windows7
コンパイルと実行に使っているソフト:Cygwin