道は険しく果てしなく
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
…と喜びたいところなのですが課題がイッパイ。
- 入力文字列が10文字という制限
- 10文字超えて入力したらバグる
- strlen()でゴマカシチャッタ
- ループ処理の中身がヤッツケすぎる
本来は、PHPでやった時みたいに入力文字数に動的対応したいワケなのです。マルチバイト文字の処理はちょっとまだハードルが高いので見送ってますが、それぐらいはせめて…。
さらに、ループ処理は自分で書いておいて何ですが、ヒドい!!知性のカケラも感じられない、まさに場当たり的コードで処理をごまかしている気がします…(-_-;ウーン。もっとエレガントでスマートに処理出来るはずです!!
自己採点はどう甘く見積もってもマイナス領域…。ポインタの基礎の基礎の基礎の…(以下10回ほど繰り返し)基礎は学びましたので、ポインタと配列の関係についてもっとキッチリ学習して、後日再挑戦したいと思います。
しかし、プログラミングに関わらずですが、人間楽で便利な方にばかり傾くと「基礎力」はつきませんね。LAMPはモチロンなのですが、C言語をジックリ学んでプログラムやPC・ハードウェア理解の基礎力を身につけたいです。
今日はここまでヾ(*’-'*)マタネー♪

はじめまして。いつも興味深く拝見しています。
配列との違いからポインタを理解することは、いいアプローチだと思いました。
> # 10文字超えて入力したらバグる
参考までに scanf(“%9s”, str); と書くと、配列に格納する文字数を制限できるようになります。
※ 9文字+”で10文字分になります。
>まちゅサン
はじめまして(でしょうか??昨年も駄文にコメントをいただいた記憶が…)
コメント有難うございます。
>いつも興味深く拝見しています
拙い文章、浅い知識、汚いコードのオンパレードでお恥ずかしい限りです。
おかしな内容を発信していたら、いつでも遠慮なくご指摘ください。
>scanf(”%9s”, str); と書くと、配列に格納する文字数を制限できるようになります
“%~”という書式指定は出力だけでなく入力時にも使えるのですね。独学の初学者にとっては、
こういった先達の方のアドバイスが何よりも有難いです。有難うございます。
C言語はPHPに比べてとても難しいですが、とても楽しくもあります。
亀の歩みでしか進めない人間ですが、出来るだけ飾らず、赤裸々に綴る事を心がけておりますので、
また覗いていただければ幸いです。
失礼しました。7月にもコメントしていましたね
楽しく学んでいる様子が伝わってきて、こちらも勉強になっています。