[C++] 156 strtok関数の書き換え

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]

HTTPプロトコルのサンプルコードで初めてstrtok関数を目にしました。文字列を区切り文字で分割したプレフィックスのポインタを返す関数です。

この関数を使った箇所を私なりに類推しながら理解しようとしましたがさっぱり分からず、ネットで意味を調べました。この関数を使うメリットは多々あるようですが、正直使いづらいです。C++でsplitする関数が一向に創出されないのは、使いづらいけど性能は相当高いstrtok関数のせいではないかと思いました。

そのような事情はさておき、私が使いやすいように自製クラスを用いて大幅に書き換えました。

個人的にはif文の条件内で処理をしTrue/Falseで条件分岐するコードはあまり好きではありません。まさか、このような書き方ができればよりハイスキルとか言ってなければいいのですが。コードサイズを切り詰める時代でもないですし、とにかく読みにくいです。

strtok関数については今のC/C++ユーザーはどのように対処しているのか気になります。

for(i = 1; i < argc; i++){
		// ホスト:パス 
		strcpy(buf, argv[i]);
		if((ptr = strtok(buf, ":")) == NULL){
			strcpy(host, "localhost");
			strcpy(path, argv[1]);

		} else {
			strcpy(host, ptr);
			if((ptr = strtok(NULL, "")) == NULL){
				fprintf(stderr, "host:path error\n");
				return -1;
			}
			strcpy(path,ptr);
		}

		// HTTP取得実行 
		DoHttpGet(host,path);
}
#include "Split.h"

Split spt;

for(i = 1; i < argc; i++){
		// ホスト:パス 
		vector<string> arg_list = spt.splits(argv[i], ":");
		const char* arg0 = (arg_list[0]).c_str();
		const char* arg1 = (arg_list[1]).c_str();

		// HTTP取得実行
		DoHttpGet(arg0, arg1);
}