サイトマップ / C言語講座出入り口総目次目次:ポインタ>ポインタの配列(2)

青い直線

ポインタの配列(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言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ポインタ>ポインタの配列(2)