Нужно ли инициализировать значения структуры перед их использованием? - PullRequest
0 голосов
/ 30 сентября 2011

Мне нужно создать динамический массив структуры wordStruct, которая содержит строку и количество раз, когда она встречается в текстовом файле:

typedef struct wordStruct{
  char word[50];
  int count = 0;
}wordStruct;

Я получу нужное число от чтенияколичество слов в файле, назовем его wordCount.

struct wordStruct *wordList;
wordList = (wordStruct *)malloc(wordCount * sizeof(wordStruct));

Это правильный способ выделения памяти для массива struct?calloc() будет лучшим вариантом?

int wordListIndex = 0;
char[50] inWord; // No word will be more than 49 characters + null terminator
for (i = 0; i < wordCount; i++){
  fscanf(data, "%s", inWord);
  for (j = 0; j < wordCount; j++){
    if (strcmp(wordList[j].word, inWord) == 0){
      wordList[j].count++;
      break;
    }
  }
  if (j == wordCount){
  strcpy(wordList[wordListIndex].word, inWord)
  wordListIndex++;
  }

Я знаю, что это, вероятно, не самый эффективный код, но у меня есть правильная идея?Могу ли я использовать метод strcmp(), даже если в этих массивах нет данных?Я новичок в структурах, и я не уверен, что я могу и не могу сделать.

Спасибо.

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Если вы используете malloc, вам нужно инициализировать массив (например, используя memset). Если вы используете calloc, массив инициализируется для вас 0.

Как только массив инициализирован, вы можете использовать strcmp для него, потому что установка его в 0 делает все слова нулевыми (пустыми) строками. Перед его инициализацией нельзя использовать strcmp.

(я предполагаю, что странные char[50] varname вместо char varname[50] являются опечатками в вашем вопросе SO, иначе это не скомпилируется. Я также игнорирую переполнение буфера в fscanf и strcpy… хорошо Технически, я думаю, что нет. И отсутствие обработки ошибок.)

0 голосов
/ 30 сентября 2011

Вложенный цикл for должен использовать wordListIndex для граничного условия и последний блок if должен быть извлечен из внутреннего цикла for. Условие должно быть

if (j == wordListIndex){
  strcpy(wordList[wordListIndex].word, inWord)
  wordListIndex++;
}
...