Thinkers'Studio
JavaとC言語の自習ツール
文字列の一部を取り出すには(substring の自作例)

 部分文字列を取り出す機能として、Java や JavaScript などには substring という機能があります。指定した位置 pos から end または長さを指定して、文字列の一部を取得する機能です。
 C言語には substring は用意されていません。 今回は、次の2つの例で部分文字列を取り出す方法を紹介します。
  (1) strncpy を使う
  (2) substring 関数を自作する

(1) strncpy で部分文字列を取り出す

 コピー元の文字列を渡すときに、文字列の先頭でなく +pos して渡します。
 strncpy は '\0' を付加しないので、取り出し後に自分で NULLストップする必要があります。
#include <stdio.h>
#include <string.h>
main() {
    char str[] = "01234567890";
    char t[64]; 

    strncpy( t, str+3, 5 ); //strの先頭+3の位置から5文字をtにコピー
    t[5] = '\0';            //取り出した文字数分の最後に'\0'を入れる
    printf( "#%s#\n", t );
}
 実行結果
#34567#

(2) substring 関数を自作する

 ここでは、次のような仕様とします。
 int mysubstr( char *t, const char *s, int pos, int len )
   機能 : 文字列sのposからlen文字をtに取り出し、戻り値0を返す
       posやlenが妥当な範囲に無いときは -1を返す
       全角文字には対応しない
【 自作 substring の例 】
#include <stdio.h>
#include <string.h>
//sのposからlen分をtに取り出して返す
int mysubstr( char *t, const char *s, int pos, int len )
{
    if( pos < 0 || len < 0 || len > strlen(s) )
        return -1;
    for( s += pos; *s != '\0' && len > 0; len-- )
        *t++ = *s++;
    *t = '\0';
    return 0;
}
main() {
    char str[] = "01234567890";
    char t[64];
    int pos, n;

    for( pos = 0, n = strlen(str); pos < strlen(str); pos++, n-- ) {
        if( mysubstr( t, str, pos, n ) == 0 )
            printf( "pos:%2d, n:%2d, #%s#\n", pos, n, t );
    }
}
 実行結果
pos: 0, n:11, #01234567890#
pos: 1, n:10, #1234567890#
pos: 2, n: 9, #234567890#
pos: 3, n: 8, #34567890#
pos: 4, n: 7, #4567890#
pos: 5, n: 6, #567890#
pos: 6, n: 5, #67890#
pos: 7, n: 4, #7890#
pos: 8, n: 3, #890#
pos: 9, n: 2, #90#
pos:10, n: 1, #0#

(今回のクイズです)
 上記の mysubstr 自作例では、結果を入れる文字配列を関数の引数でもらう仕様としました。
 別の形式として、どのような方法が考えられますか?
    (答えは、次回のC言語の Tips で ・・・)

前回のクイズの答え: (前回の問題を見る
最後に表示される i, j, k は、 -3, -1, 1 となります。
コンマ演算子でつないだ一番右にある k の評価が while の条件部の評価となります。
k が 0 になるまでは True なので繰り返しが続行され、i や j は負の値でも -- されました。