fl – Format Line 「1列の標準入力を複数列に整形して出力する」

学年末試験の真っ只中,思いつきと勢いで俺得コマンドを作ってみました。
何ができるかというと,タイトルのとおり「1列の標準入力を複数列に整形して出力する」です。

たかだかそれだけです。
ありそうなコマンドなのですが,僕は今のところ見つけてないのです。。。(同じことができるコマンドを知っていたら,教えて欲しいです。)
追記:「columnコマンドを使いましょう!」

なので,自分で作ってみました。

なんで,こんなコマンドみたいなのを作ったかというと,例えばプログラムで計算をさせたとき,大抵出力は縦1列に出力しますよね。でも,量がちょっと増えると横に並べたくなる時ってありませんか?
そういったとき,プログラムの中で出力形式まで一々指定するのは面倒だと思います。
「だったら,そういうコマンド作ればいいじゃんッ!」という事で作りました。

コマンドライン引数で列数を指定できるまで実装しました。(あとは区切り文字を指定できるようにしようと考えていますが。。。)
あと,各種チェックは本当に適当ですw

製作時間:1時間

何やってるんだか。。。

ソースコード:

/* **** fl - Format Line **************************************************** */<br>/* 1列の標準入力を複数列に整形して出力する */<br>/* 注:俺得プログラム */<br><br>/* Ver.1.0.0(2011/02/11) - Hayato OKUMOTO  ***********************************<br> *   ・思いつきでテスト期間に作成                                            *<br> *   ・引数チェックとか適当                                                  *<br> *   ・置き換え文字の指定は未実装                                            *<br> *****************************************************************************/<br>#include <stdio.h><br>#include <stdlib.h><br>#include <ctype.h><br><br>/* プロトタイプ宣言 */<br>int isdigits(char*);<br>void formatline(int, char);<br><br>/* メイン関数 */<br>int main(int argc, char *argv[])<br>{<br>    int i;<br>    int rows; //列数<br>    char fc = '\t'; //区切り文字<br>    int err = 0; //エラーフラグ<br><br>    /* コマンドライン引数の確認 */<br>    if(argc > 1) { //1つより多い(1つ目はプログラム名だから)<br>        if(isdigits(argv[1])) //第1引数が数値かどうか<br>            rows = atoi(argv[1]); //int に変換<br>        else err = 1; //引数が数値として不適<br>    } else err = 1; //引数が少ない<br><br>    if(rows < 1) err = 1; //列数が異常<br><br>    if(err) { //エラー処理<br>        puts("The Parameter is Incorrect");<br>        return 1; //異常終了<br>    }<br><br>    /* 入力を受け付けて整形して出力 */<br>    formatline(rows, fc);<br><br>    return 0; //正常終了<br>}<br><br>/* isdigit の *charバージョン */<br>/* 引数:<br> *   char *str : 数値かどうかチェックしたい文字列 */<br>/* 戻り値 : 数値であれば1,そうでなければ0 */<br>int isdigits(char *str)<br>{<br>    int i;<br><br>    for(i = 0; str[i] != '\0'; i++) { //'\0'までの文字をチェック<br>        if(isdigit((int)(str[i])) == 0)<br>            return 0; //is not digit<br>    }<br><br>    return 1; //is digit<br>}<br><br>/* 標準入力を整形して標準出力へ */<br>/* 引数:<br> *  int rows : 横列数<br> *  char fc  : 区切り文字  */<br>void formatline(int rows, char fc)<br>{<br>    int c;<br>    int count = 0;<br><br>    while((c = getchar()) != EOF) {  //ご定番<br>        /* 改行を置き換え */<br>        if(c == '\n') {<br>            count++;<br><br>            if(count == rows) //末尾かどうか<br>                count = 0; //末尾は改行<br>            else <br>                c = fc; //改行を区切り文字に置き換え<br>        }<br><br>        putchar(c);  //標準出力へ<br>    }<br>}<br><br>

実行例(素数計算の出力)

$ ./prime | ./fl 5<br>

2       3       5       7       11<br>13      17      19      23      29<br>31      37      41      43      47<br>53      59      61      67      71<br>73      79      83      89      97<br>101     103     107     109     113<br>127     131     137     139     149<br>151     157     163     167     173<br>179     181     191     193     197<br>199     211     223     227     229<br>233     239     241     251     257<br>263     269     271     277     281<br>283     293     307     311     313<br>317     331     337     347     349<br>353     359     367     373     379<br>383     389     397     401     409<br>419     421     431     433     439<br>443     449     457     461     463<br>467     479     487     491     499<br>503     509     521     523     541<br>547     557     563     569     571<br>577     587     593     599     601<br>607     613     617     619     631<br>641     643     647     653     659<br>661     673     677     683     691<br>701     709     719     727     733<br>739     743     751     757     761<br>769     773     787     797     809<br>811     821     823     827     829<br>839     853     857     859     863<br>877     881     883     887     907<br>911     919     929     937     941<br>947     953     967     971     977<br>983     991     997<br>

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください