C/400

53. これは便利な文字列を切り出す strtok (1)

strtok 関数は文字列の(トークン)を切り出す便利な関数である。
RPG の開発者にも是非、覚えておいて頂きたい関数であり、RPG の中からも
使用することができる。
C言語のマニュアルのよくあるサンプルでは

char* str = "TOM MARRY JOHN";
char* tokenPtr;

tokenPtr = strtok(str, " ");
while(tokenPtr != NULL){/*while*/
  printf("token = %s\n", tokenPtr);
  tokenPtr = strtok(NULL, " ");
}/*while*/

のように利用すると

token = TOM
token = MARRY
token = JOHN

のようにして字句(トークン) に分割することができる、という解説である。
それでは、これを何に応用するのかというと、ブラウザからの入力値をパースすることである。
ブラウザからの入力値は

変数1=値1 & 変数2=値2 & , .......

のようにして文字 & (アンパサンド) によって結合されているので、これを分割するのには
非常に役に立つことになる。

以下のパースのサンプル・ソースを紹介する。

【 サンプル 】
0001.00 #include <stdio.h>                                     
0002.00 #include <stdlib.h>                                    
0003.00 #include <string.h>                                    
0004.00                                                              
0005.00 void main(void){                                             
0006.00   char  buff[128];                                           
0007.00   char* tokenPtr;                                            
0008.00   int   pos;                                                 
0009.00                                                              
0010.00   printf("** TESTTOK1 **\n");                                
0011.00   getchar();                                                 
0012.00   memset(buff, 0, sizeof(buff));                             
0013.00   strcpy(buff, "SHCODE=0001&SHNAME=NV-CF1&&SHTANK=12000");   
0014.00   printf("buff = %s\n", buff);                               
0015.00                                                              
0016.00   tokenPtr = strtok(buff, "&");                              
0017.00   while(tokenPtr != NULL){/*while*/                          
0018.00     printf(" =>TOKEN = %s\n", tokenPtr);                  
0019.00     tokenPtr = strtok(NULL, "&");                            
0020.00   }/*while*/                                                 
0021.00   printf("**** END OF TOKEN ***\n");                         
0022.00   getchar();                                                 
0023.00 }                                                            
【 実行結果 】
  ** TESTTOK1 **                                 
>                                                
  buff = SHCODE=0001&SHNAME=NV-CF1&&SHTANK=12000 
   =>TOKEN = SHCODE=0001                         
   =>TOKEN = SHNAME=NV-CF1                       
   =>TOKEN = SHTANK=12000                        
  **** END OF TOKEN ***