C言語 標準関数 | 応用 | サンプル

標準関数
構文
応用

管理人

プライバシーポリシー


書式

#include <string.h>

char * strtok( char *str , const char *dlm );

■戻り値:
文字列strの中をdlm(デリミッタ文字列)内の各デリミッタ文字で区切って、呼び出す毎に区切った(左側の)文字列のアドレスを返す。
返す文字列がなくなったらNULL(\0)を返す。

説明

区切り文字をデリミッタと言い、例えばデリミッタ文字をつなげた
デリミッタ文字列dlm("-@/")を第2引数で指定する。

本関数strtokで目的を果たすためには、一般的に複数回呼び出す必要がある。

例えば、文字列strをハイフン(-)、アットマーク(@)、スラッシュ(/)の何れかのデリミッタ文字で区切って、その区切りまでの文字列を、その都度取得する場合に使用する。

1度目に関数を実行する場合はstrとdlmを引数として、2度目以降の呼び出しではNULLとdlmを引数として、呼び出さなくてはならない。実行毎にdlmは変更しても構わない。

尚、本関数strtokはstrの中で発見された全てのデリミッタを物理的にNULLに変更してしまうので注意が必要である。つまり、strは破壊される。

サンプル

#include <string.h>

main() {
  char str[] = "ABC@FEF-HIJ/K";
  char * adr;

  /* @をNULL(\0)に置換する */
  adr = strtok( str , "-@/" );
  printf( "str=%s\n" , adr );/* ABC */

  /* -をNULL(\0)に置換する */
  adr = strtok( NULL , "-@/" );
  printf( "str=%s\n" , adr );/* EFE */

  /* /をNULL(\0)に置換する */
  adr = strtok( NULL , "-@/" );
  printf( "str=%s\n" , adr );/* HIJ */

  /* 置換対象が無いので最後の文字列を返す */
  adr = strtok( NULL , "-@/" );
  printf( "str=%s\n" , adr );/* K */

  /* 返す文字列が無くなったのでNULLを返す */
  adr = strtok( NULL , "-@/" );
  printf( "str=%s\n\n" , adr );/* NULL */

  /* str内のデリミッタ文字は全てNULLに置換されている */
  printf( "str[0]=0x%02x\n" , str[0] );/* 0x41 */
  printf( "str[1]=0x%02x\n" , str[1] );/* 0x42 */
  printf( "str[2]=0x%02x\n" , str[2] );/* 0x43 */
  printf( "str[3]=0x%02x\n" , str[3] );/* 0x00 */
  printf( "str[4]=0x%02x\n" , str[4] );/* 0x46 */
  printf( "str[5]=0x%02x\n" , str[5] );/* 0x45 */
  printf( "str[6]=0x%02x\n" , str[6] );/* 0x46 */
  printf( "str[7]=0x%02x\n" , str[7] );/* 0x00 */
  printf( "str[8]=0x%02x\n" , str[8] );/* 0x48 */
  printf( "str[9]=0x%02x\n" , str[9] );/* 0x49 */
  printf( "str[10]=0x%02x\n" , str[10] );/* 0x4a */
  printf( "str[11]=0x%02x\n" , str[11] );/* 0x00 */
  printf( "str[12]=0x%02x\n" , str[12] );/* 0x4b */
}

実行結果

str=ABC
str=FEF
str=HIJ
str=K
str=(null)

str[0]=0x41
str[1]=0x42
str[2]=0x43
str[3]=0x00
str[4]=0x46
str[5]=0x45
str[6]=0x46
str[7]=0x00
str[8]=0x48
str[9]=0x49
str[10]=0x4a
str[11]=0x00
str[12]=0x4b


Copyright © 2008-2015 http://hitorilife.com All Rights Reserved.