2009-07-05から1日間の記事一覧

文字列から文字群が見つかった位置を返す

C K&R

K&R本 演習2-5 文字列s2の任意の文字と等しい文字列s1の最初の文字位置を返す関数any(s1,s2)を書け。ただし一致する文字がなければ-1を返す。 今度は誤読しないよう。 #include <stdio.h> int any(const char *s1,const char *s2) { const char *s = s2; int i,j; int</stdio.h>…

文字列中のある文字列を除去する

C K&R

K&R本 演習2-4 文字列s2中の任意の文字に等しい文字をs1から除去するような形のsqueeze(s1,s2)を書け。 #include <stdio.h> void squeeze (char *s, char *del) { char *p = del; int len = 0; int i,j,k; while(*del++) { len++; } for(j=i=0;s[i];++i){ if ( s[i] =</stdio.h>…

16進数から10進数へ変換するhtoi関数

C K&R

K&R本 演習2-3 16進数の文字列(0xあるいは0Xが付いているものも含めて)をそれと同値な整数値へ変換する関数htoi(s)を書け。許される文字は0から9とaからfおよびAからFである。 #include <stdio.h> int htoi (const char *s) { int n; if ( *s != '0' || !(*(s+1) != '</stdio.h>…

atoi関数での10倍していく処理

C K&R

K&R本 2.7atoi関数のサンプルがあった int atoi(char s[]){ int i, n; n = 0; for(i = 0; s[i] >= '\0' && s[i] <= '9'; ++i ) { n = 10 * n + (s[i] - '0'); } } このnの一行が素晴らしい。僕がatoi関数を自作した時はこうなっていた。 while(*str != '\0')…

定数のサフィックス

C K&R

K&R本 2.31234等の数値定数を使用する場合、サフィックスをつけることによって型を明示的に指定できる。以下に簡単な表を示す 定数 型 intの範囲内の数値(例 1234) int intの範囲以上の数値(例 5000000000) long lかLを付ける(例 1234l) long 小数点の数値(…

循環リスト

http://www.geocities.jp/ky_webid/algorithm/011.html片方向の線形リストの最後の要素が、一番最初の要素を指すわけですね。似たような実装になるんでしょうか。とりあえず実装してみます。 #include <stdio.h> #include <stdlib.h> struct LIST { int data; int last; struct </stdlib.h></stdio.h>…

extern

C K&R

K&R本 1.10関数外部で宣言された変数を関数内部で使用するにはexternが必要となる。また ある条件下ではextern宣言は省略可能である。すなわち、外部変数の定義が、特定の関数で使われる以前にそのソース・ファイルの中でなされていれば、関数内でのextern宣…

入力文字を逆転して表示する

C K&R

K&R本 演習1-19 文字列sを逆に並べる関数reverse(s)を書け。さらに、この関数を使って、入力を一時に一行ずつ逆転するプログラムを書け。 #include <stdio.h> void reverse (char *s) { char c; char *p = s; int i = 0; int j; while(*++s&&*s!='\n') { ++i; } for(j</stdio.h>…

ANSI C以前の関数の定義

C K&R

K&R本 1.7 int power(); power(base, n) int base, n; { (中略) } こういう仕様だったため、コンパイル時に引数が正しいかどうかのチェックが不可能であった。ANSI Cでは int power(int, int); int power(int base, int n) { (中略) } と書けるようになった…

プロトタイプ宣言では引数名を省略できる

C K&R

K&R本 1.7 int power(int m,int n); と int power(int,int); は同義。型さえあってれば良い。

線形リスト(片方向)

http://www.geocities.jp/ky_webid/algorithm/010.htmlさてとうとうmalloc関数を使って動的に拡張していくタイプの処理に入りました。このあたりのリスト構造を極めれば今後割りと何でも作れそうな気がします。ということでここは何としてもキッチリと押さえ…

キュー再実装

http://d.hatena.ne.jp/pknight/20090704/1246706552ちゃんとループするように再実装してみました。 #include <stdio.h> typedef struct { int data[100]; int end; int start; } queue; void enqueue (queue *q,int data) { if ( (q->end + 1) % 10 == q->start ) { </stdio.h>…

A-Z等の省略記法を展開する

C K&R

K&R本 演習3-3 文字列s1中のa-zのような省略記法を、それと等価な完全リストabc・・・xyzにしてs2中に展開する関数expand(s1,s2)を書け。大文字、小文字、数字を許し、a-b-cやa-z0-9や-a-zのような場合も処理できるようにせよ。先頭および最後の-は文字とみなす…

エスケープ文字を文字に変換する

C K&R

K&R本 演習3-2 改行文字やタブのような文字を目で見えるエスケープ文字\nや\tに変換しながら、sをtにコピーするような関数escape(s,t)を書け。switchを使うこと。 #include <stdio.h> void escape(const char *s,char *t) { for(;*s;++s){ switch(*s){ case '\t': *t+</stdio.h>…

演算子の被演算数に対する評価順序

C K&R

K&R本 2.12 x = f() + g(); のような文ではfとgの評価順序はどちらでもよい。したがって、もしfとgのどちらか一方が変数を変更し、他方がその変数に従属しているなら、xは実行順序に依存することになる。特別の順序にしたければ、この場合も一時変数を使う手…