如何通过终端读取段落作为C中的单个字符串?

我正在编写一个C程序,应该在用户的文章中阅读。 论文分为多段。 我不知道文章会有多少行或字符,但我知道它以哈希符号( # )结尾。 我想只使用尽可能多的内存来保存文章。

这是我到目前为止所尝试的:

 #include  #include  #include  main(){ int size; char *essay; printf("\n how many characters?\n"); scanf("%d", &size); essay =(char *) malloc(size+1); printf("Type the string\n"); scanf("%s",essay); printf("%s",essay ); } 

正如我之前所说,我事先并不知道(也不想问)关于字符的数量。 如何动态分配内存以节省空间? (什么是动态内存分配?)是否存在另一种节省不依赖动态分配的内存的方法?

另外,我的代码现在一次只能读取一行。 如何读取多行并将它们存储为单个字符串?

这是另一个代码

 #include  #include  int main () { char input; int count = 0; int n; char* characters= NULL; char* more_characters = NULL; do { printf ("type the essay:\n"); scanf ("%d", &input); count++; more_characters = (char*) realloc (characters, count * sizeof(char)); if (more_characters!=NULL) { characters=more_characters; characters[count-1]=input; } else { free (characters); printf ("Error (re)allocating memory"); exit (1); } } while (input!='#'); printf ("the essay: "); for (n=0;n<count;n++) printf ("%c",characters[n]); free (characters); } 

它不起作用

您可以一次读取字符并将其复制到您的论文缓冲区中。 当你的论文缓冲区空间不足时,你可以重新分配以获得另一块内存。 当你读到的角色是“#”时,你就完成了。

嗯,“不要浪费记忆中的空间”,

然后如何过度调用realloc()

 char *Read_Paragraph_i(void) { size_t size = 0; size_t i = 0; char *dest = NULL; int ch; while ((ch = fgetc(stdin)) != EOF) { if (ch == '#') break; size++; char *new_ptr = realloc(dest, size); assert(new_ptr); dest = new_ptr; dest[i++] = ch; } size++; char *new_ptr = realloc(dest, size+); assert(new_ptr); dest = new_ptr; dest[i++] = '\0'; return dest; } 

每当需要更多内存时,更合理的方法会使分配大小加倍,暂时浪费内存,然后是最终的“正确大小”分配。

如果这可以使用C ++,则可以使用string(std :: string),该字符串将在添加字符时根据需要增长。 如果你不能,那么你将不得不使用malloc创建一个数组来保存字符。 当它已满时,您必须创建一个新数据,并将当前数据从旧数据复制到新数据,然后添加新字符。 您可以在读取的每个字符上执行此操作以使用最少量的内存,但这样做效率太低。 更好的方法是在chucks中分配字符数组,保持当前大小和当前其中的字符数。 如果要添加另一个字符且数组已满,则分配一个比当前字符大一些字符数的新字符,将当前大小更新为新字符大小,然后添加新字符。