拆分出句子的单词

欢迎大家指正: 

char** SplitWords(char* words, int *nrWords)
{
	int wordsLen;
	char* token;
	char* nextTokens;
	struct list_head link = LIST_HEAD_INIT(link);
	struct list_head* pos;
	struct Strings* ss, *entry;
	char** sa;
	int i = 0;

	if (!words || !nrWords) { 
		return NULL;
	}

	wordsLen = strlen(words);
	if (!wordsLen) {
		*nrWords = 0;
		return NULL;
	}

	*nrWords = 0;
	for (token = strtok_s(_strdup(words), ",. ", &nextTokens);
		token != NULL;
		token = strtok_s(NULL, ",. ", &nextTokens)) {
		ss = (struct Strings*)malloc(sizeof(struct Strings));
		if (ss) {
			ss->string = token;
			list_add_tail(&(ss->list), &link);
			(*nrWords)++;
		}
	}

	sa = (char**)malloc((*nrWords) * sizeof(char*));
	if (sa) {
		struct list_head *tmp;
		list_for_each(pos, &link) {
			entry = list_entry(pos, struct Strings, list);
			sa[i++] = entry->string;
			tmp = pos->prev; // 想让循环继续下去的话,需要先将本节点的prev节点暂存起来,执行list_del,然后再将prev节点恢复成当前节点
			list_del(pos);
			pos = tmp;
			free(entry);
		}
	}

	return sa;
}

namespace AlgorithmTest
{
	TEST_CLASS(AlgorithmTest)
	{
	public:
		
		TEST_METHOD(TestMethod1)
		{
			char** ss = NULL;
			int n;

			ss = SplitWords("I love java.", &n);
			Assert::AreEqual(3, n);
			Assert::AreEqual("I", ss[0]);
			Assert::AreEqual("love", ss[1]);
			Assert::AreEqual("java", ss[2]);
		}

		TEST_METHOD(TestMethod2)
		{
			char** ss = NULL;
			int n;

			ss = SplitWords(NULL, &n);
			Assert::IsTrue(ss == NULL);
			ss = SplitWords("I love java", NULL);
			Assert::IsTrue(ss == NULL);

			ss = SplitWords("", &n);
			Assert::IsTrue(ss == NULL);
			Assert::AreEqual(0, n);
		}

	};
}

 

你可能感兴趣的:(算法)