サイトマップ / C言語講座出入り口総目次目次:ポインタ>ポインタとメモリブロック

青い直線

ポインタとメモリブロック

青い直線

[関数や変数のメモリ配置]←このソース→[関数へのポインタ]

/* メモリブロックを操作する関数

メモリブロックとは文字通りメモリのブロック(塊)です。文字列の配列のように連続してメモリ上に存在するものをいいます。

memcpy( )は、メモリブロックs2の先頭からnバイトをs1へコピーする標準ライブラリ関数です。コピー元とコピー先のメモリブロックが重なる場合は正常に動作しません。

    #include <string.h>
    void  *memcpy(void  *s1, const void  *s2, size_t  n);

    例:memcpy(s1, s2, n);

memcpy( )に似た関数に、memmove( )があります。

    #include <string.h>
    void *memmove(void *s1, const void *s2, size_t n);

    例:memmove(s1, s2, n);

memmove( )も、メモリブロックs2の先頭からnバイトをs1へコピーする標準ライブラリ関数です。こちらはコピー元とコピー先のメモリブロックが重なる場合でも、正常に動作します

NULLで終わる文字列をコピーする時は、strcpy( )またはstrncpy( )を使います。

ソースプログラムの説明

今日は、memmove( )を使用して、文字列からスペースを削除する方法を考えます。自作の関数RemoveSpace( )は、スペースを削除する文字列へのポインタを受け取ります。次いで、そのポインタをpにコピーします。更に、strlen( )で文字列の長さをはかります。

    #include <string.h>
    size_t strlen(const char *s);

    例:length = strlen(s);

size_tはstring.hの中で、unsigned intと宣言されています。コンパイラによっては、sizet.hのなかで、unsigned longと宣言されていてstring.hが sizet.hをインクルードしているものもあります。今回のソースプログラムではいずれであっても影響されません。文字列の長さは、lengthに代入されます。

重要:strlen( )は文字列の末尾のヌル文字を数えません。

今回のソースプログラムでは、文字列の長さは、nに代入されます。文字列の先頭から1字ずつスペースかどうか調べていき、もしスペースなら、qにもう1つ先のアドレスを代入し、qから文字列の末尾までを、スペースの位置からコピーしてスペースを削除します。

この時、文字列の長さが1減少するので、nの値を1デクリメントします。これをしないと、正常に動作しません。新しい文字列はNULLで終わっていないので、最後にNULL文字 ('\0')を付けます。 */

/* ここからソースプログラム */

#include <stdio.h>
#include <string.h>    /* memmove(  )、strlen(  )で必要  */

  /* スペースを削除する文字列 */
char *string = "effct: the result or consequence of an action etc. (from Concise Oxford Dictionary)";

void  RemoveSpace(char *str);
void main(void);

  /* スペースを削除する */
void  RemoveSpace(char *str)
{
    char *p, *q;        /* 作業用ポインタ */
    size_t n;           /* 文字列の長さをしまう */

    p = str;
    n = strlen(p);

    while (n--) {         /* 文字列の終わりでないなら */
        if (*p == ' ' )  {                    /* もしスペースなら */
            q = p + 1;                        /* qにもう一つ先のアドレスを代入 */
            memmove(p, q, strlen(q));         /* qから文字列の末尾迄をこの位置にコピー */
            n--;                              /* スペースを削除した分文字列が短くなる */
        }
        p++;        /* ポインタの指す位置を進める */
    }
    *p = '\0';      /* 文字列の末尾にヌル文字を追加 */
}

void main(void)
{

    printf("%s\n", string);
    RemoveSpace(string);
    printf ("%s\n", string);
}

/* ここまでソースプログラム */

/* ウインドウズ系の機種で作製したテキストファイルを、マッキントッシュで読むと、改行した次の行の左端に読めない文字が表示されることがあります。ウインドウズ系では、改行('\n')に続いて復帰('\r')が書き込まれます。マッキントッシュでは復帰は書き込まれません。変な表示になるのは、'\r'の表示に失敗しているためです。

復帰とは、Carriage return(CR)のことで、リターンキーをたたくと、タイプライターの印字される紙を取り付けるCarriageがチンと音をたてて左端へ移動することを言います。今回のソースプログラムを少し変えるだけで、テキストファイル中の'\r'を削除するユーティリティを作製することができます。 */

[関数や変数のメモリ配置]←このソース→[関数へのポインタ]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ポインタ>ポインタとメモリブロック