Динамические структуры и хранение данных без stdlib.h - PullRequest
2 голосов
/ 12 марта 2019

Я пытался использовать Google, но не совсем уверен, как сформулировать свой поиск, чтобы получить релевантные результаты. Язык программирования - C. Мне дали задание (домашнее задание), которое требует чтения текстового файла и вывода уникальных слов в текстовый файл. Ограничение состоит в том, что единственный допустимый импорт - <stdio.h>. Итак, есть ли способ использовать динамические структуры без использования <stdlib.h>? Будет ли необходимо определять эти динамические структуры самостоятельно? Если это уже было решено при переполнении стека, пожалуйста, укажите мне на вопрос.

Сегодня было предоставлено разъяснение, что допустимый импорт теперь включает <stdlib.h>, а также (хотя и не обязательно или не желательно) использование <string.h>, что, в свою очередь, облегчает эту проблему (и я испытываю желание сказать, что это тривиально).

Ответы [ 3 ]

4 голосов
/ 12 марта 2019

Это говорит о том, что вы не смогли ничего найти с Google. Задания с совершенно произвольными ограничениями: идиотский . Задание говорит что-то глубокое о качестве курса и преподавателя. Из задания можно узнать еще больше, что требует использования realloc и других функций стандартной библиотеки.

Вам не нужна структура данных, только достаточно большой двумерный массив символов - вы должны знать во время компиляции , как долго вы будете иметь слова и сколько их будет максимум; или вам нужно прочитать файл один раз, а затем вы собираетесь разместить двумерный массив переменной длины в стеке (и, возможно, переместить стек), сбросить указатель файла и снова прочитать файл в этот массив ...

Затем вы читаете слова в него, используя fgets, перебирая слова, используя 2 вложенных цикла for и сравнивая первую и вторую строки вместе (конечно, вы пропустите, если и внешний, и внутренний цикл находятся в тот же индекс) - если вы не найдете соответствия во внутреннем цикле, вы напечатаете слово.

Выполнение задания таким способом не учит ничего полезного в программировании, но единственная стандартная библиотечная процедура, которую вам нужно воспроизвести самостоятельно, это strcmp, и вы, по крайней мере, сэкономите свою энергию для чего-то полезного.

2 голосов
/ 12 марта 2019

Невозможно кодировать динамические структуры данных в c, используя только stdio.h. Это может быть одной из причин, по которой ваш учитель ограничил вас использованием только stdio.h - они не хотели, чтобы вы спускались по кроличьей норе, пытаясь создать связанный список или что-то, в чем можно хранить уникальные слова.

Однако, если вы думаете об этом, вам не нужна динамическая структура данных. Вот что можно попробовать: (1) сделать копию вашего исходного файла. (2) объявить текстовый файл результатов для хранения ваших результатов. (3) Скопируйте первое слово из вашего исходного файла в файл результатов. Затем пропустите ваш исходный файл и удалите каждую копию этого слова. Теперь не может быть дубликатов этого слова. Затем перейдите к следующему слову, скопируйте и удалите.

Когда вы закончите, ваш исходный файл должен быть пустым (таким образом, причина для резервного копирования), и ваш файл результатов должен иметь одну копию каждого уникального слова из исходного исходного файла.

Преимущество этого подхода состоит в том, что он не требует, чтобы вы знали (или предполагали) размер исходного исходного файла.

1 голос
/ 12 марта 2019

Согласовано с вышеприведенными пунктами об «упражнениях с произвольными ограничениями», которые в основном используются для иллюстрации любимой мозоли лектора.

Однако, если вам позволено быть наивным, вы можете делать то, что говорили другие, и предполагать,максимальный размер для вашего массива уникальных строк и использовать простой буфер.Я написал небольшую заглушку, иллюстрирующую, о чем я думал.Тем не менее, в заявлении об отказе от ответственности говорится, что я не «настоящий программист» со всеми вытекающими из этого вредными привычками и пробелами в знаниях ... Я, очевидно, также проигнорировал темы чтения файла и фильтрации уникальных слов.

#include <stdio.h>                                       // scanf, printf, etc.
#include <string.h>               // strcpy, strlen (only for convenience here)

#define NUM_STRINGS 1024                           // maximum number of strings
#define MAX_STRING_SIZE 32      // maximum length of a string (in fixed buffer)


char fixed_buff[NUM_STRINGS][MAX_STRING_SIZE];
char * buff[NUM_STRINGS]; // <-- Will only work for string literals OR
                          // if the strings that populates the buffer
                          // are stored in a separate location and the
                          // buffer refers to the permanent location.

/**
 * Fixed length of buffer (NUM_STRINGS) and max item length (MAX_STRING_SIZE)
 */
void example_1(char strings[][MAX_STRING_SIZE] )
{
  // Note: terminates when first item in the current string is '\0'
  //       this may be a bad idea(?)
  for(size_t i = 0; *strings[i] != '\0'; i++)
    printf("strings[%ld] : %s (length %ld)\n", i, strings[i], strlen(strings[i]));
}


/**
 * Fixed length of buffer (NUM_STRINGS), but arbitrary item length
 */
void example_2(char * strings[])
{
  // Note: Terminating on reaching a NULL pointer as the number of strings is
  //       "unknown".
  for(size_t i = 0; strings[i] != NULL; i++)
    printf("strings[%ld] : %s (length %ld)\n", i, strings[i], strlen(strings[i]));
}

int main(int argc, char* argv[])
{

  // Populate buffers
  strncpy(fixed_buff[0], "foo", MAX_STRING_SIZE - 1);
  strncpy(fixed_buff[1], "bar", MAX_STRING_SIZE - 1);

  buff[0] = "mon";
  buff[1] = "ami";

  // Run examples
  example_1(fixed_buff);
  example_2(buff);

  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...