ゲーム作りで学ぶ! 実践的C言語プログラミング > 第2部 ノベルゲーム > 第9章 ノベルゲーム用スクリプト言語の作成 > 文字列分割


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

文字列分割 応援する 

今回は,文字列を指定した区切り文字で分割する関数を作りたいと思います. この関数は,次節で使用する部品となります. 文字列を分割する関数は,Java言語ではStringTokenizerなどと呼ばれています. よく使いそうな機能なのですが,C言語,C++言語ともに標準では搭載されていません. よって,自分で作る必要があります.

では,文字列を分割するsplitString関数を作成してみます. 文字列分割にはstrtok関数を利用しています.使い方が分からない方はインターネット等 で調べてみてください.

script-03.cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//スクリプト最大文字数
#define SCRIPT_MAX_STRING_LENGTH 300

//文字列分割(1行の最大文字数は SCRIPT_MAX_STRING_LENGTH)
//src : 分割したい文字列
//dest: 分割された文字列
//delim: 区切り文字
//splitNum : 最大分割数
void splitString(char* src, char* dest[], const char* delim, int splitNum)
{
        int i;
        char* cp;
        char* copySrc;

        //元の文章をコピーする
        copySrc = (char*)malloc( sizeof(int) * SCRIPT_MAX_STRING_LENGTH + 1);
        strncpy( copySrc, src, SCRIPT_MAX_STRING_LENGTH );
        cp = copySrc;

        //strtokを使って copySrc をdelim区切りで分割する
        for( i = 0; i < splitNum ; i++ ) {
                //分割対象文字列が無くなるまで分割
                if( (dest[i] = strtok(cp, delim)) == NULL ) {
                        break;
                }
                //2回目にstrtokを呼び出す時は,cpをNULLにする
                cp = NULL;
        }
        //分割された文字列の最後の要素はNULLとしておく
        dest[i] = NULL;
}

//デバッグ用
//elemの要素を表示
void printElements(char* elem[])
{
        int i;
        for( i = 0; elem[i] != NULL; i++ ) {
                printf("%d : %s\n", i + 1, elem[i] );
        }
}

int main()
{
        char* dest[100];
        const char* delim = " ";

        splitString("@message test 222 333", dest, delim, 3);
        printElements( dest );

        splitString("@switch    test 333 444 555", dest, delim, 6);
        printElements( dest );

        return 0;
}

プログラムの実行結果は以下のようになりました. 空白区切りで文字列が分割されていることがわかります.

実行結果
1 : @message
2 : test
3 : 222
1 : @switch
2 : test
3 : 333
4 : 444
5 : 555

[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

このサイトについて|ヘルプ|Q&A|個人情報保護|プライバシーポリシー|利用規約|コメント・トラックバック規約|削除規程|広告掲載
Copyright (c) 2005-2007 Time Intermedia Corporation