連載
» 2014年12月12日 11時00分 UPDATE

完全マスター! 組み込みC言語プログラミング(15):【問題14】ポインタなしで関数は語れない (1/2)

C言語においてポインタは「何か(オブジェクト)を指すもの」ですが、単純に何かを指すだけではなく、関数内のオブジェクトを参照することもできます。ポインタなしに関数は語れないという実例を確認してみましょう。

[横田一弘 埼玉県立新座総合技術高等学校 教諭,MONOist]

 本連載では、これから組み込みシステムのプログラミングを学びたい人向けに、C言語を使ったマイコン制御プログラムの“イロハ”を解説していきます。

 毎回少しずつステップアップしていけるよう、本文の最後で問題を出し、次回その解答と解説を紹介していきます。

問題14の解答

 C言語の関数呼び出しで、引数にポインタを渡す場面があります。

  • 配列のように大きいデータを関数に渡すとき
  • 関数の引数から値(結果)を受け取りたいとき

 今回の問題では、この2つの場面が現れます。

問題14:

文字列を受け取り、その文字列に英字と数字がそれぞれ何文字含まれているか求める関数を作ってください。


 ここではまず、引数に文字列を渡すことになっています。C言語の文字列は「charの配列」ですから、つまり関数に配列を渡すことになります。

 そして関数の結果として、文字列に含まれる英字の数と数字の数の2つを受け取ります。関数の返す値は1つだけですから、今回は引数から値を受け取ることにします。

 けれども以前、C言語の関数呼び出しでは引数を値渡しするので、「関数を呼び出すときに引数に変数を指定しても、関数から値を変更することはできない」と述べました。疑問に思いませんか?

 実はすでにscanfを使って、引数から値を受け取っています。例えばintの変数 a と b に入力したいとき、

scanf("%d%d", &a, &b);

 と書きませんでしたか? そうです、変数の前にアンパサンド( & )を付けることがポイントです。では解答を発表します。

#include <stdio.h>
#include <ctype.h>
 
void char_count(const char *str, int *alps, int *digs);
 
void main(void)
{
    char str[100];
    int a, d;
 
    printf("文字列を入力してください->");
    scanf("%s", str);
    char_count(str, &a, &d);
    printf("英字は%d文字あります¥n", a);
    printf("数字は%d文字あります¥n", d);
}
 
void char_count(const char *str, int *alps, int *digs)
{
    int acnt, dcnt;
    const char *p;
 
    acnt = 0;
    dcnt = 0;
    for (p = str; *p != '¥0'; p++) {
        if (isalpha(*p)) acnt++;
        else if (isdigit(*p)) dcnt++;
    }
    *alps = acnt;
    *digs = dcnt;
}
chcnt.c

 chcnt.cを実行すると、次のような結果になります。

photo
       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.