C/C++区切り文字列関数split(カスタム)
1634 ワード
コードは次のとおりです.
解析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の区切り記号は後続のマーカーごとに異なり、以前のマーカーの内容にも依存する可能性があります.
この
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関数は,タグ化された文字列の外に格納されないようにし,実行時制約をチェックする.