同意上述关于“任意约束的练习”的观点,主要用于说明讲师最喜欢的宠物。
但是,如果你被允许天真,你可以做别人所说的,并假设你的独特字符串数组的最大大小,并使用一个简单的缓冲区。我写了一个小小的存根,说明了我的想法。然而,与免责声明共享的是,我不是一个“真正的程序员”,随之而来的是所有不良习惯和知识差距...... 我显然也忽略了阅读文件和过滤独特单词的主题。
#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; }
仅使用stdio.h无法在c中编写动态数据结构。这可能是你的老师限制你只使用stdio.h的原因之一 - 他们不希望你试图制作链表或者存储独特单词的东西。
但是,如果您考虑一下,则不需要动态数据结构。这里有一些尝试:(1)制作源文件的副本。 (2)声明结果文本文件以存储结果。 (3)将源文件中的第一个单词复制到结果文件中。然后贯穿你的 的 源文件 强> 并删除该单词的每个副本。现在不能有任何重复的单词。然后转到下一个单词并复制并删除。
完成后,源文件应为空(因此备份的原因)和结果文件应该包含原始源文件中每个唯一单词的一个副本。
这种方法的好处是它不需要您知道(或猜测)初始源文件的大小。