您好我试图读取"无限制"的用户输入长度为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;
}
答案 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个不同答案。使用int
。 getchar()
可能会返回EOF
。 @Andrew Henle
轻微:最好将size_t
用于数组索引,而不是int
。 int
可能过于狭窄。
最后代码需要执行以下操作:
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;
}