比较相同的单词

标签 c string free multidimensional-array realloc

我是 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;
}

好吧,现在我有 2x 2Darrays,然后对它进行排序 (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);
}

给我一​​个段错误。 感谢您的宝贵时间,对于我糟糕的英语和糟糕的编程技能,我深表歉意。

最佳答案

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

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

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

关于比较相同的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20424263/

相关文章:

c - 如何在c中正确释放()我的malloc

c++ - 将数字(金额)转换为文字的免费跨平台库?

c - 使用 c 打印目录的程序不工作,递归调用出现问题

c - 语法:typedef 和 struct 标记解释

java - 如何编写一个通用的 isEmpty 方法来检查是否为空?

string - 从实数到字符串变量对话

Java邮件API : Convert Message to String?

c - 在没有树的地方双重释放或腐败

c - 如何在 c 中将字符串转换为十六进制,反之亦然?

c - 是什么名字?