前提・実現したいこと
コマンド行引数として与えられたファイル名をもつファイルの中身を調べ、 その行数と文字数(改行文字も文字として数える)とをこの順に標準出力に書き出します。 行数と文字数は、それぞれ、左詰にして1行として書き出します。
コマンド行に引数が1個与えられたのでないときは、 「argc!=2」と左詰にして1行として標準出力に書き出すとともに、 コマンド行に与えられた引数全てを、与えられた順に、 それぞれ左詰にして1行として標準エラー出力に書き出し、 その後で exit(-1); によって実行を打ち切ります。また、引数が1個与えられていても、それをファイル名としてファイルを開くことができなかったときは、標準出力に「can't open:」の後ろに空白1文字に続けてその引数を書き出して改行したのちに、exit(-1); によって実行を打ち切ります。
発生している問題・エラーメッセージ
思う通りに動作しません。
該当のソースコード
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { #define LINESIZE 100 FILE *f; char line[LINESIZE]; int i; int x; int n; if( argc!=2 ) { printf("argc!=2\n"); for(i= 1; i<argc; i++) { fprintf(stderr, "%s\n", argv[i]); } exit(-1); } n= atoi(argv[1]); f = fopen(n, "rw"); if( argc==2 && f== NULL ) { for(i= 1; i<argc; i++) { printf("can't open: %s\n", argv[i]); } exit(-1); } for(i= 1; fgets(line, LINESIZE, f)=='\n'; i++) { for(x= 0; line[x]!=NULL; x++); } } printf("%d\n%d\n", i, x); fclose(f); return 0; }
補足
一応自分でも書いてみました。ご教授お願いします。
ここにより詳細な情報を記載してください。
思う通りに動かないとは、どういうふうに動くのでしょうか
コンパイルエラーではじき返され全く動作しません。
エラーメッセージをそのままコピペして、質問に追記してください
8-3.c: In function 'main': 8-3.c:17:9: warning: implicit declaration of function 'exit' [-Wimplicit-function-declaration] exit(-1); ^ 8-3.c:17:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] 8-3.c:20:5: warning: implicit declaration of function 'atoi' [-Wimplicit-function-declaration] n= atoi(argv[1]); ^ 8-3.c:21:5: warning: passing argument 1 of 'fopen' makes pointer from integer without a cast [enabled by default] f = fopen(n, "rw"); ^ In file included from 8-3.c:1:0: /usr/include/stdio.h:272:14: note: expected 'const char * __restrict__' but argument is of type 'int' extern FILE *fopen (const char *__restrict __filename, ^ 8-3.c:26:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] exit(-1); ^ 8-3.c:29:39: warning: comparison between pointer and integer [enabled by default] for(i= 1; fgets(line, LINESIZE, f)=='\n'; i++) { ^ 8-3.c:30:26: warning: comparison between pointer and integer [enabled by default] for(x= 0; line[x]!=NULL; x++); ^
y_wakiwaiさん このようなものが出てます。
もう少しヒントを頂けますか⁇
for(i= 1; i<argc; i++) とありますが、コマンドライン引数ファイル名を複数指定することもできるようにしたいのですか?現状だと argc==2をチェックしてからこのfor文に行ってるので、1回しかループしません。