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

时间:2015-11-10 19:37:06

标签: 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);
   }

它不能正常工作

3 个答案:

答案 0 :(得分:1)

您可以一次阅读字符并将其复制到您的论文缓冲区中。当你的论文缓冲区空间不足时,你可以做一个realloc来获得另一块内存。当你读的角色是&#34;#&#34;你已经完成了。

答案 1 :(得分:1)

嗯,不要浪费内存空间&#34;,

然后如何过度调用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;
}

一个更理智的方法会在每次需要更多内存时将分配大小加倍,暂时浪费内存,然后是最终的#right;#size;#34;分配

答案 2 :(得分:0)

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