Thinkers'Studio
JavaとC言語の自習ツール
substring の自作例(2)(文字列を返す関数の仕様を考える)

 前回のTips で、自作 substring をつくりました。 今回は、それを別の形式に変えた実現例です。

substring 関数を自作する(その2)

 ここでは、元の文字列を引数に渡すと、その同じ領域に結果を返す方法を使います。
 (前回の作成例では、結果を入れる文字列へのポインタを渡しました)
 int mysubstr( char *s, int pos, int len )
   機能 : 文字列sをposからlen文字の取り出し結果に置き換え、戻り値0を返す
       posやlenが妥当な範囲に無いときは -1を返す。全角文字には対応しない

 文字列を返す関数では、結果を受け渡す領域の大きさが問題になります。
 使い方に合った適切な形式を選ぶことが必要です。今回の方法では、次の点が注意点です。
  ・ 元の文字列が必要な場合は、別の文字列にコピーしてから渡すなどの対応が必要です。
  ・ 加工後に文字列が長くなる場合には使えません。

【 自作 substring(2) の例 】
#include <stdio.h>
#include <string.h>

//sをposからlen分に置き換えて返す
int mysubstr( char *s, int pos, int len )
{
    int i;

    if( pos < 0 || len < 0 || pos+len > strlen(s) )
        return -1;
    i = 0;
    while( i < len )
        s[i++] = s[pos++];
    s[i] = '\0';
    return 0;
}

main() {
    char str[] = "01234567890";
    if( mysubstr( str, 0, 8 ) == 0 ) printf( "#%s#\n", str );
    if( mysubstr( str, 1, 5 ) == 0 ) printf( "#%s#\n", str );
    if( mysubstr( str, 2, 3 ) == 0 ) printf( "#%s#\n", str );
}
 実行結果
#01234567#
#12345#
#345#

(今回のクイズはありません)

前回のクイズの答え: (前回の問題を見る
上記例のほかに、次の方法などが考えられます。
  • 関数内の static 変数に結果を書き、そのポインタを返す
  • 関数内で malloc した領域に処理結果を入れ、そのポインタを返す
  • グローバル変数に結果を書き、そのポインタを返す