日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

<< 過去

未来 >>

いろいろやり方があるならこんなCもいい

Libserverが飛んでしまったので、書き直し。
プログラミングの授業ではCを使ってるのだが、
それでテストには使う気が起きないようなお茶目なプログラムを書いた。
#include <stdio.h>
#include <stdlib.h>
int die(char*);
main(int argc,char** argv){
FILE* fp;
int d=1,wd,ld;
if(argc<=2) die("usage: homework1 <filename> <last date> [<first day of week>]");
( ld=atoi(argv[2]) )||die("Error : Invalid last date");
if(argc>3) d=1-atoi(argv[3]);
if(d<-5||d>1) die("Error : Invalid first day of week");
( fp=fopen(argv[1],"w") )||die("Error : Cannot open file");
fputs("Su Mo Tu We Th Fr Sa\n",fp);
while(1){
for(wd=0;wd<7;wd++){
fprintf(fp, d>0 ? "%2d " : " " ,d);
if(++d>ld) break;
}
fputc('\n',fp);
if(d>ld) break;
}
fclose(fp);
return 0;
}
int die(char* msg){
fputs(msg,stderr);
fputc('\n',stderr);
exit(EXIT_FAILURE);
return 0;
}
ファイル名・一月の日数、一日の曜日を指定したらカレンダーを出力してくれるプログラム。
homework1.cとしたけど、別に宿題ではない。
授業でファイル名・一月の日数、一日の曜日をプログラム内部で指定する、
というのはやったけど、まぁそれともだいぶ違う書き方。
一見したらなんじゃこりゃという内容かも。
Perlのdieに似たdie関数を定義した。
( ld=atoi(argv[2]) )||die("Error : Invalid last date");というのは、
Perlのor dieに似ている。まぁちょっと書き方違うけど。
普通Cではこんな書き方しないけど、実はこういう書き方もできる。
ただ、Borland C++ Compilerにはおそらく不正な代入と警告されますが…
あとatoiは文字列を数値に変換するもの。
読める数字がないときは0を返す。
||dieは返り値が0のときだけ死ぬということだからいいですね。
けど0のときも0を返す。
今回は0という数値自体不正だからこれでOK。
まぁそれはそうと、sscanfよりも便利かも知れませんね。
ちなみにatoiとかのシリーズはstdlib.hに入ってる。
そうそう、NULLポインタは絶対に0らしい。
Cの仕様でそうなってるんだとか。
日付を表示するところで三項演算子を使ってみた。
わかりにくいけど、結構スマートでいいですね。
まぁこんなプログラムは結構不気味ですけど、
それはそうとして授業ではprintf・fprintfばっかりですね。
実際はいろいろありますよね。
文字列を書き出すならfputs、
文字を書き出すなら標準出力にはputchar、ファイルへはfputcですね。
標準出力に文字列を書き出すputsは改行が入るので少し違うなぁと。
まぁprintfが一番便利ですけど、%とかで思わぬ問題が起きるかも知れんからね。
単に文字列を書くならfputsを使いましょうと。
標準出力に出したければfputs(str,stdout);とすればいいですね。
それはそうなんだが、ファイル関係の関数はfprintfとfscanfだけ引数が特殊なのよね。
fprintf(fp,"Hello!"); fscanf(fp,"%s",str);
fputs("Hello",fp); fgets(str,sizeof(str),fp);
ほらファイルポインタが最初にあるか最後にあるか。
これは僕も困った。まぁ無用な混乱を避けるには便利なfprintfばっかり使うのがいいのかな?
と思わないこともない。
Author : Hidemaro
Date : 2008/11/28(Fri) 23:59
コンピュータ・インターネット | Comment | trackback (0)
blog comments powered by Disqus

トラックバック

トラックバックURL取得

Tools