サイトマップ / C言語講座>出入り口>総目次>目次:ポインタ>ポインタの配列(2)
[ポインタの配列(1)]←このソース→[複数の値を返す関数]
今回のソースプログラムのメインルーチンの中で、ライブラリ関数strtok( )が使われています。トークン(token)とは、文字列を解析し、取り出してきた最小の単語のことです。
トークンの取り出しで既に説明をしましたが、復習します。コンパイラはソースプログラムを解析し、トークンを取り出し、それを解釈して、プログラムを作ります。
#include <string.h> char *strtok(char *s1, const char *s2); 例:token = strtok(s1, s2); 実行結果 戻り値 成功 トークンへのポインタ 失敗 NULL
strtok( )は文字列からトークンが見つからなくなるまで、複数回呼び出します。
最初の呼び出しでは、s1に解析対象の文字列へのポインタを入れます。2回目以降の呼び出しでは、NULLを指定します。もし、別の文字列を調べたければ、新しい文字列へのポインタを指定します。
今回のソースプログラムでは、for ( )ループの中でstrtok( )が呼ばれています。
for (p = buff; (q = strtok(p, " \t\n")) != NULL; p = NULL) {
for ( )ループの初期化の式p = buffで、ポインタpをbuffの先頭アドレスを指すようにします。従って、最初に呼ばれた条件判断の式の中のstrtok( )は、下記の形で呼ばれます。
q = strtok(buff, " \t\n")
その後に、p = NULLが実行されるので、2度目以降のstrtok( )の呼び出しは、次の形で実行されます。なお、" \t\n"はスペースとタブと改行コードを区切り文字と見なすということです。
q = strtok(NULL, " \t\n")
Calc( )の中では、標準ライブラリ関数atoi( )が使われています。この関数は文字列を整数値に変換します。atoiはアスキーコード(ASCII code)を整数(integer)へ変換(to)するという意味です。
#include <stdlib.h> int atoi(const char *s); 例:n = atoi(s); 実行結果 戻り値 成功 変換後の数値
Calc( )の中では、ライブラリ関数strcmp( )も使われています。2つの文字列を辞書的に比較します。
#include <string.h> int strcmp(const char *s1, const char *s2); 例:strcmp(s1, s2); 実行結果 戻り値 s1 > s2 正の値 s1 = s2 0 s1 < s2 負の値
プログラムを実行する際には、キーボードから、 数字、スペースかタブ、4則演算の演算子(+ - * /)、スペースかタブ、数字の順に入力して下さい。メインルーチンでキーボードから入力した文字列をトークンに分解し、取り出したトークンを2次元配列に保存します。
関数 Calc( )は引数として、ポインタへのポインタを取ることにより、2次元配列の各要素にアクセスします。 */
#include <stdio.h> #include <string.h> /* strtok( )、strcmp( )で必要 */ #include <stdlib.h> /* atoi( )で必要 */ #define BUF_SIZE 256 /* fgets( )で取り込むデータの最大値 */ #define N_TOKEN 10 /* 取り込むトークンの数の最大値 */ #define LEN_TOKEN 10 /* トークンの最長の長さ */ int Calc(const char **keyptr); void main(void); /* トークンを解析し演算結果を返す */ int Calc(const char **keyptr) /* ポインタへのポインタを */ { /* 引数として取る */ int x, y; x = atoi(keyptr[0]); /* 文字列を整数に変換 */ y = atoi(keyptr[2]); /* 文字列を整数に変換 */ if (!strcmp(keyptr[1], "*" ) ) /* かけ算か? */ return (x * y); else if (!strcmp(keyptr[1], "/")) /* 割算か? */ return (x / y); else if (!strcmp(keyptr[1], "+")) /* たし算か? */ return (x + y); else if (!strcmp(keyptr[1], "-")) /* 引き算か? */ return (x - y); else return (-1); /* どれでもない時 */ } void main(void) { char buff[BUF_SIZE]; /* 入力のしまい場所 */ char key[N_TOKEN][LEN_TOKEN]; /* トークンを保存 */ const char *keyptr[N_TOKEN]; /* ポインタの配列 */ char *p, *q; /* 作業用ポインタ */ int n = 0; /* 配列の添字として使用 */ printf("数字 四則演算子 数字と入力して下さい\t"); fgets(buff, BUF_SIZE, stdin); /* 入力された文字列をbuffにしまう */ /* トークンの取り出し */ for (p = buff; (q = strtok(p, " \t\n")) != NULL; p = NULL) { strcpy(key[n], q); keyptr[n] = key [n]; /* アドレスをkeyptr[n]に保存 */ n++; } printf("%s %s %s = %d\n", key[0], key[1], key[2], Calc(keyptr)); } |
/* Calc( )はint型の整数を返すので、小数点以下は切り捨てられます。 */
[ポインタの配列(1)]←このソース→[複数の値を返す関数]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−