C:将字符串读入动态数组

时间:2016-06-15 15:04:12

标签: c

您好我试图读取"无限制"的用户输入长度为char数组。它适用于较短的字符串,但对于超过30个字符,程序崩溃。为什么会发生这种情况?我该如何解决这个问题?

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

char* read_string_from_terminal()//reads a string of variable length and returns a pointer to it
{
    int length = 0; //counts number of characters
    char c; //holds last read character
    char *input;

    input = (char *) malloc(sizeof(char)); //Allocate initial memory

    if(input == NULL) //Fail if allocating of memory not possible
    {
        printf("Could not allocate memory!");
        exit(EXIT_FAILURE);
    }

    while((c = getchar()) != '\n') //until end of line
    {
        realloc(input, (sizeof(char))); //allocate more memory
        input[length++] = c; //save entered character
    }

    input[length] = '\0'; //add terminator
    return input;

}

int main()
{
    printf("Hello world!\n");
    char* input;
    printf("Input string, finish with Enter\n");
    input = read_string_from_terminal();
    printf("Output \n %s", input);
    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:0)

realloc(input, (sizeof(char))); //allocate more memory仅分配1 char。不是1 更多 char@MikeCAT

(sizeof(char)*length+1)在语义上是错误的。应该是(sizeof(char)*(length+1)),但是从sizeof (char) == 1起,它没有任何功能差异。

需要null字符的空间。 @MikeCAT

应测试重新分配失败。

char c不足以区分getchar()的所有257个不同答案。使用intgetchar()可能会返回EOF@Andrew Henle

轻微:最好将size_t用于数组索引,而不是intint可能过于狭窄。

最后代码需要执行以下操作:

size_t length = 0;
char *input = malloc(1);
assert(input); 
int c;
...
while((c = getchar()) != '\n' && c != EOF) {
  char *t = realloc(input, length + 1);
  assert(t); 
  input = t;
  input[length++] = c;
}
...
return input;

int main(void) {
  ...
  input = read_string_from_terminal();
  printf("Output \n %s", input);
  free(input);
  return EXIT_SUCCESS;
}