在C中使用strcpy,strcat的冲突?

时间:2016-11-01 20:41:31

标签: c strcpy strcat

在下面的代码中,我试图逐字加载一个单词的文本文件 然后我试图在哈希表中保存每个字(字符串数组) 但似乎strcpy保存了整个单词而不是单char,我不知道为什么。我是否误用了strcpystrcat

# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
# include <stdbool.h>
bool load(const char* dictionary);

#define LENGTH 45


int main (int argc, char* argv[])
{
  char* dictionary = argv[1];
  load(dictionary);
  return 0;
}

bool load(const char* dictionary)
{
  int index = 0, words = 0, kk = 0;
  int lastl = 0, midl = 0;
  char word[LENGTH + 1];
  char *wholeword[1001];

  FILE* dic = fopen(dictionary, "r");
  if (dic == NULL)
  {
    printf("Could not open %s.\n", dictionary);
    return false;
  }

  for (int c = fgetc(dic); c != EOF; c = fgetc(dic))
  {
    // allow only alphabetical characters and apostrophes
    if (isalpha(c) || (c == '\'' && index > 0))
    {
      // append character to word
      word[index] = c;
      index++;

      // ignore alphabetical strings too long to be words
      if (index > LENGTH)
      {
        // consume remainder of alphabetical string
        while ((c = fgetc(dic)) != EOF && isalpha(c));
        // prepare for new word
        index = 0;
      }
    }

    // ignore words with numbers (like MS Word can)
    else if (isdigit(c))
    {
      // consume remainder of alphanumeric string
      while ((c = fgetc(dic)) != EOF && isalnum(c));

      // prepare for new word
      index = 0;
    }

    // we must have found a whole word
    else if (index > 0)
    {
      // terminate current word
      word[index] = '\0';
      lastl = index - 1;
      midl = (index - 1) % 3;
      words++;
      index = 0;

      int hashi = (word[0] + word[lastl]) * (word[midl] + 17) % 1000;

      wholeword[hashi] = (char*) malloc(sizeof(char) * (lastl + 2));

      strcpy(wholeword[hashi], &word[0]);  // ***

      for (kk = 1; kk <= lastl + 1; kk++)
      {
        strcat(wholeword[words], &word[kk]);
      }
    }
  }
  fclose(dic);
  return true;
}

2 个答案:

答案 0 :(得分:2)

Strcpy不复制单个字符,它会复制所有字符,直到下一个空('\0')字节。要复制代码中的单个字符,请尝试:

wholeword[hashi] = &word[0];

而不是:

strcpy(wholeword[hashi], &word[0]);

答案 1 :(得分:0)

是的,你误用strcpystrcat:这些函数将整个源字符串复制到目标数组(在strcat的现有字符串的末尾。)

以下几行:

  wholeword[hashi] = (char*) malloc(sizeof(char) * (lastl + 2));

  strcpy(wholeword[hashi], &word[0]);  // ***

  for (kk = 1; kk <= lastl + 1; kk++)
  {
    strcat(wholeword[words], &word[kk]);
  }
}

可以通过一次调用来替换

   wholeword[hashi] = strdup(word);

strdup()分配内存,将参数字符串复制到它并返回指针。它适用于所有Posix系统,如果您没有,请使用以下两行:

  wholeword[hashi] = malloc(lastl + 2);
  strcpy(wholeword[hashi], word);

注意:

  • 你假设你的哈希是完美的,没有碰撞。按照当前编码,碰撞会导致前一个单词从字典中删除,并且相应的内存将丢失。
  • 字典char *wholeword[1001];load函数中的局部变量。它是未初始化的,因此无法知道条目是否是指向单词的有效指针。它应该被分配,初始化为NULL并返回给调用者。