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

标签 c string scanf

我正在编写一个 C 程序,该程序应该读取用户的文章。这篇文章分为多个段落。 我不知道这篇文章有多少行或字符,但我知道它以井号(#)结尾。我只想使用容纳论文所需的内存。

这是我迄今为止尝试过的:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


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 <stdio.h>    
#include <stdlib.h>    
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);
   }

它不工作

最佳答案

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

关于c - 如何通过终端将段落读取为 C 中的单个字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33645322/

相关文章:

ios - 如何将 .c 文件包含到我的 ios 应用程序中?

c - FUSE 文件系统在打开文件时崩溃(仅在 Release模式下)

java - 将 SQL 命令转换为 JSON 参数格式

string - perl 仅将整个单词与数组列表匹配

c - 如何读取和输出带有空格和换行符的输入

c - C 在哪里存储 '\0' ?

c - Malloc 和双重发行

java - java中如何在字符列表中添加值并在下一个值为空时停止添加

c - scanf() 在 malloc 结构成员中不起作用

c - 如何同时使用 scanf 和 fgets 读取文件