1. 程式人生 > 實用技巧 >c++之面試題(2)實現字串的分割函式SplitStr

c++之面試題(2)實現字串的分割函式SplitStr

題目描述

3.實現一個將字串按指定字元分隔的函式,形式已經確定如下,請完成標有“//請補充”的內容。
說明:返回值為是否找到分割符(true找到,false未找到),當未找到分割符時返回原字串。
舉例:SplitStr("abc|bc|c", '|', vect) 返回true, vect結果:abc, bc, c
SplitStr("abc|bc|c", 's', vect) 返回false, vect結果:abc|bc|c
SplitStr("|bc|c", '|', vect) 返回true, vect結果:空字串, bc, c

bool SplitStr(const char* pStr, char chSplit, vector<string>& vectRet)
{
//請補充



    const char* p = pStr;
    const char* pStart = pStr;
    int32 nLen = 0;
    char ch = 0;
    while (1)
    {
    ch = *p;

    //請補充



    p++;
    }
    return ((int32)vectRet.size() > 1);
}

程式碼

自己實現的程式碼被//----------------------------------------------------------------------------------------夾在中間

bool SplitStr(const char* pStr, char chSplit, std::vector<std::string>& vectRet)
{
	
	//請補充
//----------------------------------------------------------------------------------------
	if (nullptr == pStr || NULL == pStr)
		return false;
//----------------------------------------------------------------------------------------


	const char* p = pStr;
	const char* pStart = pStr;
	int nLen = 0;
	char ch = 0;
	while (1)
	{
		ch = *p;

//----------------------------------------------------------------------------------------
		// 已經到字串結尾,跳出迴圈
		if ('\0' == ch)
		{
			if (nLen == 0)
			{
				;
			}
			else
			{
				// 將剩下的字串拷貝到vector中。
				std::string str(pStart, nLen);
				vectRet.push_back(str);
			}

			break;
		}

		// 還沒有到字串的結尾
		else
		{
			// 與分隔符不一致,長度+1,繼續找
			if (ch != chSplit)
			{
				nLen++;
			}
			else
			{
				// 處理"|"開頭的情況 
				if (p == pStr)
				{
					pStart += 1;
				}
				else
				{
					// 
					std::string str(pStart, nLen);
					vectRet.push_back(str);

					// 這裡+ 1是為了跳過下一個  分隔符
					pStart += nLen + 1;
					nLen = 0;
				}
			}
		}

//----------------------------------------------------------------------------------------

		p++;
	}
	return ((int)vectRet.size() > 1);
}

測試

  • 1.程式碼
	std::vector<std::string> vec;
	bool ret = SplitStr("abc|bc|c", 's', vec);

	std::cout << ret << "\n";
	std::for_each(std::begin(vec), std::end(vec), [](const std::string& str)
	{
		std::cout << "str=";
		if (0 == str.length())
			std::cout << " ";
		else
			std::cout << str.c_str() << "		";
	});

"abc|bc|c" 輸出結果:

  • 2.程式碼
	std::vector<std::string> vec;
	bool ret = SplitStr("abc|bc|c", '|', vec);

	std::cout << ret << "\n";
	std::for_each(std::begin(vec), std::end(vec), [](const std::string& str)
	{
		std::cout << "str=";
		if (0 == str.length())
			std::cout << " ";
		else
			std::cout << str.c_str() << "		";
	});

輸出結果:

  • 3.程式碼
	std::vector<std::string> vec;
	bool ret = SplitStr("|bc|c", '|', vec);

	std::cout << ret << "\n";
	std::for_each(std::begin(vec), std::end(vec), [](const std::string& str)
	{
		std::cout << "str=";
		if (0 == str.length())
			std::cout << " ";
		else
			std::cout << str.c_str() << "		";
	});

輸出結果