C/C++区切り文字列関数split(カスタム)

1634 ワード

コードは次のとおりです.
void spilt(char *srcStr, const char* sep, std::vector<:string> &vecStr)
{
	if (srcStr == nullptr)
		return;
	
    //①     
	int len = strlen(srcStr);
	char *str = new char[len + 1];
	strcpy_s(str, len + 1, srcStr);

	char *p = nullptr;
    char *nextStr = nullptr;

	p = strtok_s(str, sep, &nextStr);
	while (p)
	{
		if (p != nullptr)
		{
			std::string cc(p);
			vecStr.push_back(cc);
			p = strtok_s(nullptr, sep, &nextStr);
		}

	}

	return;

}

解析1:コードのタグ①
文字列strcpyの追加s()の原因:strtok_を避けるs()の最初のパラメータは、入力されたパラメータが定数ポインタである場合、プログラムにセグメントエラーが発生し、クラッシュを引き起こす.
例:1.char *srcStr= "ssss sss s sss ss";//(定数タイプ)パラメータを直接使用するとプログラムがクラッシュし、エラーが発生します
後の定数のヘッダアドレスをsrc Strに渡すことを指す.
           2. char srcStr[] = "ssss sss s sss ss";//正しい
char src Strに相当する[18].  memcpy(srcStr,"ssss sss s sss ss",18); 
実行するたびに定数「ssss sss s sss」をコピーし、引用符付き定数は読み取り専用データ領域に配置され、変更できません.
一方,src Str[18]はスタック内に配置された配列であり,修正が可能である.
     
解析2:strtok_s()
プロトタイプ:char*_cdecl strtok_s( char * _Str,  const char * _Delim,  char ** _Context);
パラメータの説明:
_Str:このパラメータは、分割する文字または文字列全体を格納するために使用されます(変更されます).
_Delim:このパラメータは区切り記号を格納するために使用されます(例:,!@#$%^&*()tなど単語を区別できる記号)
_Context:このパラメータは分割された文字列を格納するために使用されます
に注意
この関数は破壊的です.文字列strの要素に'0'文字が書き込まれます.特に、文字列文字はstrtokの最初のパラメータとして使用できません.
strtokを呼び出すたびに、スレッドが安全ではない静的変数が変更されます.
他のほとんどのマーカーとは異なり、strtokの区切り記号は後続のマーカーごとに異なり、以前のマーカーの内容にも依存する可能性があります.
このstrtok_s関数は、POSIX strtok_とは異なるr関数は,タグ化された文字列の外に格納されないようにし,実行時制約をチェックする.