サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−