第6回:関数と配列

今週は,関数に配列を渡す練習をします.特に文字列を扱う関数を取り上げます.まず,入力された文字の長さを返す関数を作ってみましょう.


配列の受け渡し

まず,配列を受け渡している例を見てください.

#include <stdio.h>

void dim_init(int *ary, int no, int val)
{
    int i;

    for(i = 0; i < no; i++){
        ary[i] = val;
    }
}

void main()
{
    int i;
    int  ary[] = {1,2,3,4,5};

    dim_init(ary, 5, 0);

    for(i =0; i < 5; i++){
        printf("ary[%d] = %d\n", i, ary[i]);
    }
}

このプログラムは,配列aryの先頭からno番目までの要素の値をvalに設定する関数です.関数の初期化などの際に用います.関数には,配列の先頭のアドレス(ary)が渡されるので,関数側ではポインタ(int *ary)で受け取っています.


文字列の受け渡し

まず,文字列の扱い方を復習しよう.

文字列は,配列として扱うことを思い出してください.関数に文字列を受け渡すには,上記の配列の場合と同様,ポインタを用います.


ここで,文字の長さを数えるプログラムを関数を用いて書き換えてみよう.

#include <stdio.h>

void main()
{
    char str[128];
    int  i;

    printf("文字列を入力してください:");
    scanf("%s", str);

    for(i = 0; str[i] != 0x00; i++);

    printf("入力された文字列は,%sです.", str);
    printf("文字数は,%dです.",i);
}

ここで,青い色の部分を関数にしてみよう.

#include <stdio.h>

int moji_nagasa(char *str)
{
    int i;

    for(i = 0; str[i] != 0x00; i++);

    return(i);
}

void main()
{
    char str[128];
    int  i;

    printf("文字列を入力してください:");
    scanf("%s", str);
    printf("入力された文字列は,%sです.", str);
    printf("文字数は,%dです.", moji_nagasa(str));
}


演習

前期の期末試験で作成した,入力されたアルファベットの小文字の文字列をabc順に並べ替えるプログラムを関数を用いて書き換えよ.

手順:

   文字数を数える関数を用いて,文字数を数える

   二つの文字を入れ替えるswapという関数を作る

   swap関数をもちいて,配列の並べ替えをするsortという関数を作る

(ヒント)関数の中から,すでに定義してある別の関数を呼び出して使うことができる.

#include <stdio.h>

void main()
{
    char s[256], t;
    int n, i, j;

    //文字列の入力
    printf("単語を入力してください\n");
    scanf("%s", s);
    printf("入力された文字列は%sです.\n", s);

    // 文字数を数える
    for(i=0; s[i] != 0x00; i++);
    printf("文字数は,%d文字です.\n", i);

    n = i;

    // 並び替え
    for(i=0; i < n-1; i++){
        for(j=i+1; j < n; j++){
            if(s[i] > s[j]){
                t = s[i];
                s[i] = s[j];
                s[j] = t;
            }
        }
    }

    printf("結果 : %s\n", s);
}