欢迎大家指正:
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);
}
};
}