使用C中的realloc通过char读取输入char

时间:2016-05-20 10:55:53

标签: c memory-management realloc

我想通过char读取输入char并将其作为单词保存到char *数组中。我不知道输入会有多长,所以我想分配memmory dynamicaly。当char是空格时,程序结束。我怎么能用realloc做到这一点? 有我的代码:

#include <stdio.h>
int main(void) {
    char *word=malloc(1*sizeof(char));
    char c;
    int numOfChars=0;
    c=getchar();
    word[0]=c;
    numOfChars++;
    while((c=getchar())!=' '){
        numOfChars++;
        realloc(word,numOfChars);
        word[numofChars-1]=c;
    }
    printf("%s", word);

    return 0;
}

示例输入:Word 示例输出:Word

3 个答案:

答案 0 :(得分:2)

为了解释我的想法,我迅速设置这个小程序来解释如何使用指数式增长:

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

#define INITIAL_CAPACITY 100
#define GROW_FACTOR 1.5

struct string_buffer {
  size_t capacity;
  size_t length;
  char *buffer;
};

typedef struct string_buffer string_buffer_t;

string_buffer_t *sb_init(void);
static void sb_grow(string_buffer_t *sb);
void sb_shrink(string_buffer_t *sb);
char *sb_release(string_buffer_t *sb);

void sb_append_char(string_buffer_t *sb, char c);
char *sb_peek_string(string_buffer_t *sb);

int main(void)
{
  string_buffer_t *sb=sb_init();
  int c;

  while ( (c=getchar())!=' ' && c!='\n' && c!=EOF )
    sb_append_char(sb, c);

  char *string=sb_release(sb);
  printf("string : \"%s\"\nlength : %zu\n", string, strlen(string));
  free(string);
  return 0;
}

string_buffer_t *sb_init(void)
{
  string_buffer_t *new=malloc(sizeof *new);
  if (new==NULL) exit(EXIT_FAILURE);

  new->capacity=INITIAL_CAPACITY;
  new->length=1;
  new->buffer=malloc(INITIAL_CAPACITY);
  if (new->buffer==NULL) exit(EXIT_FAILURE);
  new->buffer[0]=0;

  return new;
}

static void sb_grow(string_buffer_t *sb)
{
  char *new=realloc(sb->buffer, (size_t) (GROW_FACTOR*sb->capacity));
  if (new==NULL) exit(EXIT_FAILURE);
  sb->capacity=(size_t) (GROW_FACTOR*sb->capacity);
  sb->buffer=new;
}

void sb_shrink(string_buffer_t *sb)
{
  char *new=realloc(sb->buffer, sb->length);
  if (new==NULL) exit(EXIT_FAILURE);
  sb->buffer=new;
}

char *sb_release(string_buffer_t *sb)
{
  sb_shrink(sb);
  char *string=sb->buffer;
  free(sb);
  return string;
}

void sb_append_char(string_buffer_t *sb, char c)
{
  if (sb->capacity==sb->length) sb_grow(sb);
  sb->buffer[sb->length-1]=c;
  sb->buffer[sb->length]=0;
  sb->length=sb->length+1;
}

答案 1 :(得分:2)

该程序可以通过以下方式查看。考虑到输入被缓冲并填充,直到输入一个也是空白字符的换行符。如果要使用格式说明符%s输出结果,则结果字必须为零。

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

int main( void )
{
    int c;
    size_t n;
    char *word;
    char *tmp;

    n = 0;
    word = malloc( n + 1 );
    word[n++] = '\0';

    printf( "Enter a word: " );

    while ( ( c = getchar() ) != EOF && !isspace( c ) && ( tmp = realloc( word, n + 1 ) ) != NULL )
    {
        word = tmp;
        word[n-1] = c;
        word[n++] = '\0';
    }

    printf( "You've entered \"%s\"\n", word );

    free( word );
}        

程序输出可能看起来像

Enter a word: Hello
You've entered "Hello"

答案 2 :(得分:1)

这样做

#include <stdio.h>
#include <stdlib.h>
int main(void) {
  char *ptr;
  char *word=malloc(1*sizeof *word);
  char c;
  int numofChars=0;
  printf("Enter string terminated by a space :");
  c=getchar();
  word[0]=c;
  numofChars++;

  while((c=getchar())!=' '){
    numofChars++;
    ptr=realloc(word,numofChars*sizeof *ptr);
    if(ptr!=NULL)
    {
      word=ptr;
      word[numofChars-1]=c;
    }
  }
  /* You need to append a null character to make it a valid string */
  numofChars++;
  ptr=realloc(word,numofChars*sizeof *ptr);
  if(ptr!=NULL)
  {
    word=ptr;
    word[numofChars-1]='\0';
  }

  printf("Word : %s\n", word);

  free(word); // Freeing word/

  return 0;
}

好吧,你可以编写一个替换

的函数
 numofChars++;
      ptr=realloc(word,numofChars*sizeof *ptr);
      if(ptr!=NULL)
      {
        word=ptr;
        word[numofChars-1]='\0';
      }

注意: 不建议你这样做

  word=realloc(word,numOfChars*sizeof(char));

因为如果realloc失败,则会发生内存泄漏。所以我在这里使用ptr