K&R

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 小数点の数値(…

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); は同義。型さえあってれば良い。

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は実行順序に依存することになる。特別の順序にしたければ、この場合も一時変数を使う手…

ヒストグラム

C K&R

K&R本 演習1-13 入力した単語の長さをヒストグラムにしてプリントするプログラムを書け。 動的にデータの長さが変わると難しいのでとりあえず固定値でやってみた #include <stdio.h> #include <math.h> #include "mylib.h" int main(void) { int num[] = { 1,2,3,2, 1,2,3,4, </math.h></stdio.h>…

入力文字を単語に切り分ける

C K&R

K&R本 演習1-12 入力した単語を1行に一つずつ印字するプログラムを書け。 表示させるだけなら単純。 #include <stdio.h> int main(void) { int c; int line = 0; while ( (c = getchar()) != EOF ) { if ( c == ' ' ) { line = 1; } else { if ( line ) { line = 0; p</stdio.h>…

単語のカウント

C K&R

K&R本 1.5.4 サンプルもあるが、自分で実装してみる。 #include <stdio.h> #include <ctype.h> // K&R 1.5.4 int main (void) { int c; int count = 0; int word = 0; FILE *fp; if ( (fp = fopen("test.txt","r")) == NULL ) { puts("file open error"); return 1; } while ( </ctype.h></stdio.h>…

空白、タブ、改行を数える

C K&R

K&R本 演習1-8 空白、タブ、改行を数えるプログラムを書け #include <stdio.h> int main (void) { int c; int count = 0; FILE *fp; if ( (fp = fopen("test.txt","r")) == NULL ) { puts("file open error"); return 1; } while( (c = fgetc(fp)) != EOF ) { switch(</stdio.h>…

getchar()

C K&R

K&R 1.5.1 #include <stdio.h> int main (void) { int c; c = getchar(); while ( c != EOF ) { putchar(c); c = getchar(); } return 0; } キーボードからの入力をそのまま出力このようなwhile文はもっとコンパクトに書けるイディオムがある。 #include <stdio.h> int main (v</stdio.h></stdio.h>…

プログラミング言語C(通称K&R本)

C K&R

プログラミング言語C 第2版 ANSI規格準拠作者: B.W.カーニハン,D.M.リッチー,石田晴久出版社/メーカー: 共立出版発売日: 1989/06/15メディア: 単行本購入: 28人 クリック: 721回この商品を含むブログ (201件) を見る WebでのC言語の勉強も一通りおわり、区切…