scanfの戻り値を調べてみた_その2

scanf関数の戻り値について若干追記します。

調べたところによると
scanf関数の戻り値は、正常に取得できたデータの個数だそうです。
ですので以下のプログラムでは、a,b,cに正しく整数値を格納できたときのscanfの戻り値は3になります。
異常が生じたときは、正常な個数だけ値が戻されます。

/* three.c */
#include


int main(void)
{
int a,b,c;
int x;

x = scanf("%d%d%d", &a,&b,&c);
printf("Your data is : %d %d %d\n", a,b,c);
printf("Scanf returned %d\n", x);

return 0;
}


$ gcc -o three three.c


$ ./three
1
2
6
Your data is : 1 2 6
Scanf returned 3
$ ./three
3
5
q
Your data is : 3 5 15552500
Scanf returned 2
$ ./three
2
q
Your data is : 2 134513824 4448244
Scanf returned 1
$ ./three
1
q
Your data is : 1 134513824 2527220
Scanf returned 1
$ ./three #EOFを入力してみる
Your data is : -1076778936 134513824 3690484
Scanf returned -1

scanfの戻り値を調べてみた

scanf関数は、C言語の入門編で頻出の関数です。
whileのループとの組み合わせで用いられることが多い気がしましたので、
そのメカニズムについて検証してみました。

まずは以下のプログラムを作成しました。

/* scanf_test.c */
#include

int main(void)
{
int a;
int b;

printf("Enter integer data.\n");
b = scanf("%d", &a);

printf("a = %d\n", a);
printf("b = %d\n", b);

return 0;
}


これをscanf_testをコンパイルしてscanf_testという実行ファイルを生成したとします。
以下のようにしてscanf_testプログラムを通じて、scanf関数の戻り値(bに格納されている)をテストしてみました。

$ ./scanf_test
Enter integer data.
20
a = 20
b = 1
$ ./scanf_test
Enter integer data.
0
a = 0
b = 1
$ ./scanf_test
Enter integer data.
-3
a = -3
b = 1
$ ./scanf_test
Enter integer data.
T
a = 7864308
b = 0
$ ./scanf_test
Enter integer data.   ##ここではCntrol + D(End Of File)を入力している
a = 16359412
b = -1

aをint型で宣言したので、それに不適合な変数が格納されようとすると、scanfは0や-1を返すようです。

この性質を利用すれば、whileループと組み合わせて、効率よく目的のデータ型の変数を取得できます。

/* scanf_test_2.c */
#include
int main(void)
{
int a;
int b;
printf("Enter integer data.\n");
printf("Enter q(別に数字以外ならなんでもいいけど) to quit the program.\n");
while(scanf("%d",&a) == 1){
printf("Your input data is %d\n", a);
}
return 0;
}



$ ./scanf_test_2
Enter integer data.
Enter q(別に数字以外ならなんでもいいけど) to quit the program.
3
Your input data is 3
0
Your input data is 0
-4
Your input data is -4
q

ncbiのftpサーバーからzebrafishの全遺伝子情報をとってくる

#ftpサーバーに接続
$ ftp ftp ftp.ncbi.nih.gov

ftp> ls
ftp> cd refseq
ftp> ls
ftp> cd D_rerio
ftp> get README
ftp> cd mRNA_Prot
ftp> ls
ftp> get zebrafish.rna.fna.gz
ftp> quit

$ gunzip zebrafish.rana.fna.gz

$ less zebrafish.rana.fna

Linuxコマンドのソースコードを見てみる。

徳にDeveloperであるわけではないのだが、
いやむしろLinux初心者であるわけだが、
Linuxのコマンドや標準Cライブラリのソースコードを見ることにとても憧れています。
ソースコードをビルドするときに
リンクされているバイナリファイルたち。。


コマンドのソースはGNUに置いてあります。

$ wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.4.tar.gz
$ tar xzvf coreutils-8.4.tar.gz
$ cd coreutils-3.4/src
#興奮の瞬間。catのソースをとりあえずみてみる。
$ less cat
$ ../lib
#ここには標準Cライブラリのソースコードがいっぱい
#やっほい!!!
#楽しすぎる!!!!

manコマンドを大切にしたい

$ man man
で表示される下記の9項目を意識してLinuxを操りたいものだ。

1 実行プログラムまたはシェルのコマンド
2 システムコール (カーネルが提供する関数)
3 ライブラリコール (システムライブラリに含まれる関数)
4 スペシャルファイル (通常 /dev に置かれている)
5 ファイルのフォーマットとその約束事。例えば /etc/passwd など
6 ゲーム
7 マクロのパッケージとその約束事。例えば man(7), groff(7) など
8 システム管理用のコマンド (通常は root 専用)
9 カーネルルーチン [非標準]