★文字と文字列(文字列6)★


文字列操作用の命令(関数)を紹介します。

これまでに作った、

 文字列の長さを求める

 文字列をコピーする

 文字列を連結する

というプログラムについても専用の命令(関数)があります。

文字列操作に関する命令(関数)を使う際にはstring.hをインクルードする必要があります。


まずは、文字数を調べるstrlenという命令(関数)から紹介します。

strlenとは[string length]の略称です。

そのまま、「文字列の長さ」ですね。

<sample program 086-01>

#include <stdio.h>
#include <string.h>

#define MAX_STRING 10

int main(void)
{
    char str[MAX_STRING];
    
    int length;

    scanf("%s", str);

    length = strlen( str);

    printf("length = %d\n", length);

    return 0;
}

<実行結果>

ABCDEF
length = 6
続行するには何かキーを押してください・・・

文字列にあるヌル文字までの文字数を返してくれます。


次に文字列をコピーする strcpy を紹介します。

strcpy は[string copy]の略称です。

<sample program 086-02>

#include <stdio.h>
#include <string.h>

#define MAX_STRING 10

int main(void)
{
    char str1[MAX_STRING];
    char str2[MAX_STRING];
    
    scanf("%s", str1);

    strcpy( str2, str1);

    printf("str2 = %s\n", str2);

    return 0;
}

<実行結果>

ABC
str2 = ABC
続行するには何かキーを押してください・・・

strcpy(コピー先, コピー元);

これで、str1の中身をstr2にコピー出来ます。


strcpyで文字列を直接コピーすることも可能です。

<sample program 086-03>

#include <stdio.h>
#include <string.h>

#define MAX_STRING 10

int main(void)
{
    char str[MAX_STRING];

    strcpy( str, "Hello");

    printf("str = %s\n", str);

    return 0;
}

<実行結果>

str = Hello
続行するには何かキーを押してください・・・

strcpyは、配列に格納できる最大文字数を超えてコピーすると問題が発生します。

コンパイルした時に出た警告メッセージに気づきましたか?

  warning C4996: 'strcpy': 
  This function or variable may be unsafe.
  Consider using strcpy_s instead.
  To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
  See online help for details.

  note: 'strcpy' の宣言を確認してください

これは、strcpyは安全ではないのでstrcpy_sを使ってくださいというメッセージです。

何が安全でないのかというと、strcpyはコピーする文字数のチェックを行っていません

そのため、最大文字数よりも大きな文字列をコピーした場合、他の領域まで文字をコピーしてしまい、データを破壊する恐れがあるからです。

<sample program 086-04>

#include <stdio.h>
#include <string.h>

#define MAX_STRING 10

int main(void)
{
    char str[MAX_STRING];

    strcpy(str, "Hello C Language World");

    printf("str = %s\n", str);

    return 0;
}

<実行結果>

str = Hello C Language World
続行するには何かキーを押してください・・・

次は文字列を連結するstrcatを紹介します。

strcatは[string catenate]の略称です。

<sample program 086-05>

#include <stdio.h>
#include <string.h>

#define MAX_STRING 10

int main(void)
{
    char str1[MAX_STRING] = "ABC";
    char str2[MAX_STRING] = "DEF";
    
    strcat( str1, str2);

    printf("str1 = %s\n", str1);

    return 0;
}

<実行結果>

ABCDEF
続行するには何かキーを押してください・・・

strcat(連結先, 連結元);

これで、str1の後ろにstr2を連結することが出来ます。

ただ、strcatも安全でないと警告が出ていますね。

strcpyと同じように、連結先の配列の最大文字数を超えてしまうことをチェックしていないためです。


strcpy、strcatについては入門書にも記載があることも多く、検定試験にも出てくるため紹介しました。

しかし、現実にはもっと使い勝手の良い命令(関数)がありますので、私は使うことが余りありません。

その命令(関数)はstdio.hをインクルードすることで使えるsprintfという命令(関数)です。

次回はsprintfについて説明します。


次へ

戻る

目次へ