C 比较相同的词

C 比较相同的词,c,string,free,multidimensional-array,realloc,C,String,Free,Multidimensional Array,Realloc,我是C语言编程新手,有两个问题。我有两个字符串,然后我需要将它们拆分为单词,并找出两个字符串是否包含相同的单词。我将用我的代码解释它 输入: "He said he would do it." "IT said: 'He would do it.'" 这两个字符串被放入两个数组中。首先,我需要解析来自其他字符的单词 调用函数: char ** w1 = parse(s1, &len1); 变量len统计行数(字) 函数解析: char ** parse(char *w, int *

我是C语言编程新手,有两个问题。我有两个字符串,然后我需要将它们拆分为单词,并找出两个字符串是否包含相同的单词。我将用我的代码解释它

输入:

"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;
}
函数等于:

int equals(char *w1, char *w2)
{
   if (strcmp(w1, w2) == 0)
       return 1;
   return 0;
}
我知道所有这些都可以更快,但首先我需要解决我的问题。这适用于我在开始时编写的输入,但当我键入长字符(例如500个字符)时,我的结果是
中止
。我认为问题在于:

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);
}
void清除(字符**w,整数最大值)
{
int i;
对于(i=0;i
给我一个分段错误。
感谢您的时间,我为我糟糕的英语和糟糕的编程技能感到抱歉。

它似乎混淆了您逻辑中解析函数的字长和字数

char ** f = (char**) malloc(len * sizeof (char*));

例如,我认为上述部分中的
len
应该是字数而不是字符数。

我的意思是
len
是字符数。我必须获得2d数组中最长单词的列数。@user3013004如果将内存分配为字符串,那么它应该是
sizeof(char)
而不是
sizeof(char*)
。此外,它看起来好像没有被使用。此外,关于空闲区域不安全,似乎出现了
free(token)
。@user301304如果将内存分配为字符串的最大长度,我认为这不是2Darray。@user301304同样,函数
Clear
中的“分段错误”似乎是因为不保护双精度。
char ** f = (char**) malloc(len * sizeof (char*));