我是C语言编程的新手,我遇到了2个问题。我有两个字符串,然后我需要将它们分成单词并找出两个字符串是否包含相同的单词。我将用我的代码解释它。
输入:
"He said he would do it."
"IT said: 'He would do it.'"
这两个字符串放在两个数组中。起初我需要解析其他人物的文字。
通话功能:
char ** w1 = parse(s1, &len1);
变量len
计算行数(单词)。
功能解析:
char ** parse(char *w, int * i)
{
int j = 0, y, dupl = 0; //variables for cycles and duplicate flag
char d[] = " <>[]{}()/\"\\+-*=:;~!@#$%^&_`'?,.|";
char* token = strtok(w, d);
unsigned len = strlen(token), x;
unsigned plen = len;
char ** f = (char**) malloc(len * sizeof (char*));
while (token != NULL)
{
len = strlen(token);
for (x = 0; x < len; x++)
{
token[x] = tolower(token[x]);
}
for (y = 0; y < *i; y++) //cycle for deleting duplicated words
{
if (equals(token, f[y]) == 1)
{
dupl = 1; break;
}
}
if (dupl == 1)
{
token = strtok(NULL, d);
dupl = 0;
continue;
}
if (len >= plen)
{
f = (char**) realloc(f, (len+1) * sizeof (char*));
plen = len;
}
else
f = (char**) realloc(f, (plen+1) * sizeof (char*));
f[j] = token;
token = strtok(NULL, d);
*i = *i + 1;
j++;
}
free(token);
return f;
}
好的,现在我有2个2D阵列,然后对它进行排序(qsort(w1, len1, sizeof (char*), cmp);
)并进行比较:
for (i = 0; i < len2; i++)
if (equals(w1[i], w2[i]) == 0)
return 0;
功能等于:
int equals(char *w1, char *w2)
{
if (strcmp(w1, w2) == 0)
return 1;
return 0;
}
我知道所有这些都可以更快,但首先我需要解决我的问题。这适用于我在开头写的输入,但是当我输入长达500个字符的内容时,我的结果是Aborted
。我认为问题在于:
f = (char**) realloc(f, (len+1) * sizeof (char*));
但不知道为什么。 第二件事是,我无法释放我的阵列。此
void Clear (char ** w, int max)
{
int i;
for (i = 0; i < max; i++)
free(w[i]);
free(w);
}
给了我一个分段错误。 感谢您的时间,我很抱歉我的英语不好,编程能力差。
答案 0 :(得分:0)
它似乎混淆了逻辑中解析函数中的单词长度和单词数。
char ** f = (char**) malloc(len * sizeof (char*));
我认为上述部分len
的例子应该是字数而不是字符数。