道は険しく果てしなく

2009 年 2 月 23 日 | カテゴリー: こっそり学ぶC言語

あまりの内容の薄さに、連載1回目にして最終回を迎えた「コマンドラインからPHP」シリーズ。エントリの最後で見苦しく言い訳しておりましたが、本来はCで挑戦してみたかったわけなのです。

という事でやってみました(= ‘艸’)ムププ

<reverse.c>

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[10]; /* 入力文字列を格納 */
    char rev[10]; /* 反転文字列を格納 */
    int i, cnt;

    printf("input>>>");
    scanf("%s", str);
    printf("Input data    -->\t%s\n", str);
    printf("Data  address -->\t%p\n", str);

    cnt = strlen(str);
    for (i = 0; i <= cnt; i++) {
        /* 末尾にNULL文字を追加 */
        if (i == 0) {
            rev[cnt] = '\0';
        } else {
            rev[cnt - i] = str[i - 1];
        }
    }
    printf("Reverse data  -->\t%s\n", rev);
    return 0;
}

で、これをコンパイルして実行してみると…

$ gcc -o reverse reverse.c
$ ./reverse
$ input>>>test
$ Input data    -->	test
$ Data  address -->	0xbf7fdfe6
$ Reverse data  -->	tset

ヤッタ〜(≧∇≦)b

…と喜びたいところなのですが課題がイッパイ。

  1. 入力文字列が10文字という制限
  2. 10文字超えて入力したらバグる
  3. strlen()でゴマカシチャッタ
  4. ループ処理の中身がヤッツケすぎる

本来は、PHPでやった時みたいに入力文字数に動的対応したいワケなのです。マルチバイト文字の処理はちょっとまだハードルが高いので見送ってますが、それぐらいはせめて…。

さらに、ループ処理は自分で書いておいて何ですが、ヒドい!!知性のカケラも感じられない、まさに場当たり的コードで処理をごまかしている気がします…(-_-;ウーン。もっとエレガントでスマートに処理出来るはずです!!

自己採点はどう甘く見積もってもマイナス領域…。ポインタの基礎の基礎の基礎の…(以下10回ほど繰り返し)基礎は学びましたので、ポインタと配列の関係についてもっとキッチリ学習して、後日再挑戦したいと思います。

しかし、プログラミングに関わらずですが、人間楽で便利な方にばかり傾くと「基礎力」はつきませんね。LAMPはモチロンなのですが、C言語をジックリ学んでプログラムやPC・ハードウェア理解の基礎力を身につけたいです。

今日はここまでヾ(*’-'*)マタネー♪

  1. 2009 年 2 月 26 日 05:00

    はじめまして。いつも興味深く拝見しています。
    配列との違いからポインタを理解することは、いいアプローチだと思いました。

    > # 10文字超えて入力したらバグる

    参考までに scanf(“%9s”, str); と書くと、配列に格納する文字数を制限できるようになります。
    ※ 9文字+”で10文字分になります。

  2. taro
    2009 年 2 月 27 日 00:21

    >まちゅサン

    はじめまして(でしょうか??昨年も駄文にコメントをいただいた記憶が…)
    コメント有難うございます。

    >いつも興味深く拝見しています

    拙い文章、浅い知識、汚いコードのオンパレードでお恥ずかしい限りです。
    おかしな内容を発信していたら、いつでも遠慮なくご指摘ください。

    >scanf(”%9s”, str); と書くと、配列に格納する文字数を制限できるようになります

    “%~”という書式指定は出力だけでなく入力時にも使えるのですね。独学の初学者にとっては、
    こういった先達の方のアドバイスが何よりも有難いです。有難うございます。

    C言語はPHPに比べてとても難しいですが、とても楽しくもあります。
    亀の歩みでしか進めない人間ですが、出来るだけ飾らず、赤裸々に綴る事を心がけておりますので、
    また覗いていただければ幸いです。

  3. 2009 年 2 月 27 日 11:59

    失礼しました。7月にもコメントしていましたね :)
    楽しく学んでいる様子が伝わってきて、こちらも勉強になっています。